Ruby比操作数更奇怪的行为

时间:2014-04-05 22:06:19

标签: ruby ruby-2.1

有人可以解释一下为什么会发生这种情况

$ 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?

2 个答案:

答案 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?方法按字符进行比较。