【发布时间】:2014-05-18 05:21:19
【问题描述】:
谁能解释一下为什么会发生这种情况
$ 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 >
为什么"10" > "3" 返回 false ?
【问题讨论】:
谁能解释一下为什么会发生这种情况
$ 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 >
为什么"10" > "3" 返回 false ?
【问题讨论】:
因为在所有这些情况下,比较的是字符串,而不是数字。当比较字符串时,它是逐个字符完成的。显然,字符 "1" 比字符 "3"“少”。
【讨论】:
String 类包含Comparable 模块。因此,在每个测试中,您都在执行,实际上调用了Comparable#> 方法,而后者又调用了String#<=> 方法。
为什么
"10" > "3"返回true?
首先查看文档 - 如果字符串的长度不同,并且与最短的相比,字符串相等 > 长度,则 longer 字符串被认为 greater 比 shorter 字符串。
现在,在您的情况下,是的,'10' 和 '3' 的大小不同。但是与最短长度相比,字符串不相等,因此更长的字符串不被认为更大 em> 比 短 一个。 表示较长字符串中的1,不等于最短字符串中的'3'。这个相等是由String#eql? 执行的。
现在再次考虑示例"10" > '1',它返回true,因为与最短长度相比,字符串相等,因此较长的字符串被认为大于较短的字符串。
但当字符串的大小相等时,则逐个字符进行比较,使用String#eql?方法。
【讨论】: