2014-02-07 47 views
3

我在一个我正在研究的项目中遇到一段代码,这看起来有点吓人。它应该在两个数字之间显示+/-增量,但它使用>来比较数字串而不是数字。在Ruby中使用>(大于号)比较两个字符串?

我假设代码正在按预期工作,所以我只是想了解Ruby如何在这种情况下比较这些字符串。

下面是替换为变量的示例:

if '55.59(100)' > '56.46(101)' 
    delta = '+' 
else 
    delta = '-' 
end 
+1

As @ Zack'说,所有的比较都是基于班级的“宇宙飞船”方法。有关详细信息,请参见[String#<=>](http://www.ruby-doc.org/core-2.1.0/String.html#method-i-3C-3D-3E)。 –

回答

4

String包括Comparable模块,其限定<>>=等,基于该基类的比较(<=>)方法。因此,如果字符串a在字符串b之前按字母顺序排列,则a <=> b返回-1<返回true。同样的<=>方法用于对字符串进行排序,因此您可以想象,在排序的字符串数组中,每个字符串都是'小于'其右侧的邻居。

8

非常当您比较数字lexicographically的字符串表示形式时要小心。 (即第一个字符第一个字符,第二至第二...)

irb(main):001:0> '44' < '45' 
=> true 
irb(main):002:0> '44.123(whatever)' < '99.921(bananas)' 
=> true 

irb(main):003:0> '44.123' < '100' 
=> false 
irb(main):004:0> '44.123' < '9.123' 
=> true 

只要你知道,你总是比较等宽弦,字典序匹配数值排序。如果他们不这样做,坏事开始发生(特别是当最重要的数字发生变化时)。