我在一個我正在研究的項目中遇到一段代碼,這看起來有點嚇人。它應該在兩個數字之間顯示+/-增量,但它使用>
來比較數字串而不是數字。在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)。 –