有人可以解释一下为什么会发生这种情况
$ 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?
答案 0 :(得分:1)
因为在所有这些情况下,比较字符串,而不是数字。比较字符串时,它是按字符逐个完成的。显然,字符"1"
比字符"3"
“少”。
答案 1 :(得分:0)
String
类包含Comparable
模块。因此,在每个测试中,您正在执行,实际上调用了Comparable#>
方法,后者又调用了String#<=>
方法。
为什么
"10" > "3"
会返回true
?
首先查看文档 - 如果字符串的长度不同,并且字符串等于,则与最短进行比较>长度,然后更长字符串被认为更强 更短。
现在,在您的情况下,是的,'10'
和'3'
大小不同。但与最短长度进行比较时字符串相等,因此更长的字符串不被视为更大比 short 一个。这意味着来自较长字符串的1
与最短字符串不等于'3'
。这种平等由String#eql?
执行。
现在再次考虑示例"10" > '1'
,它返回true
,因为字符串相等与最短进行比较时长度,因此较长的字符串被视为较大 较短 。
但当字符串的等于大小时,则使用String#eql?
方法按字符进行比较。