我在一个我正在研究的项目中遇到一段代码,这看起来有点吓人。它应该在两个数字之间显示+/-增量,但它使用>
来比较数字串而不是数字。在Ruby中使用>(大于号)比较两个字符串?
我假设代码正在按预期工作,所以我只是想了解Ruby如何在这种情况下比较这些字符串。
下面是替换为变量的示例:
if '55.59(100)' > '56.46(101)'
delta = '+'
else
delta = '-'
end
我在一个我正在研究的项目中遇到一段代码,这看起来有点吓人。它应该在两个数字之间显示+/-增量,但它使用>
来比较数字串而不是数字。在Ruby中使用>(大于号)比较两个字符串?
我假设代码正在按预期工作,所以我只是想了解Ruby如何在这种情况下比较这些字符串。
下面是替换为变量的示例:
if '55.59(100)' > '56.46(101)'
delta = '+'
else
delta = '-'
end
String
包括Comparable
模块,其限定<
,>
,>=
等,基于该基类的比较(<=>
)方法。因此,如果字符串a在字符串b之前按字母顺序排列,则a <=> b
返回-1
,<
返回true
。同样的<=>
方法用于对字符串进行排序,因此您可以想象,在排序的字符串数组中,每个字符串都是'小于'其右侧的邻居。
是非常当您比较数字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
只要你知道,你总是比较等宽弦,字典序匹配数值排序。如果他们不这样做,坏事开始发生(特别是当最重要的数字发生变化时)。
As @ Zack'说,所有的比较都是基于班级的“宇宙飞船”方法。有关详细信息,请参见[String#<=>](http://www.ruby-doc.org/core-2.1.0/String.html#method-i-3C-3D-3E)。 –