2014-02-07 43 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 

只要你知道,你總是比較等寬弦,字典序匹配數值排序。如果他們不這樣做,壞事開始發生(特別是當最重要的數字發生變化時)。