Can someone please explain me why this can be happening
$ irb
2.1.1 :001 > "9" > "3"
=> true
2.1.1 :002 > "10" > "3"
=> false
2.1.1 :005 > "2.3" > "2.1"
=> true
2.1.1 :003 >
Why is "10" > "3"
returning false ?
因为在所有这些情况下,比较的是字符串,而不是数字。当比较字符串时,它是逐个字符完成的。显然, character"1"
比 character 'less' "3"
。
String
类包含Comparable
模块。因此,在每个测试中,您都在执行实际调用Comparable#>
方法,而方法又调用String#<=>
方法。
为什么
"10" > "3"
退货true
?
首先查看文档-如果字符串的长度不同,并且与最短长度相比,字符串相等,则认为较长的字符串大于较短的字符串。
现在在你的情况下,是的,'10'
并且'3'
是不同的 size。但是与最短的长度相比,字符串并不相等,因此较长的字符串不被认为大于较短的字符串。这意味着1
来自较长的字符串,不等于'3'
来自最短的字符串。这个相等是由 执行的String#eql?
。
现在再次考虑该示例"10" > '1'
,它返回true
,因为与最短长度相比,字符串相等,因此较长的字符串被认为大于较短的字符串。
但是当字符串大小相等时,使用方法逐个字符进行比较。String#eql?