有人可以解释以下代码的工作原理吗?
"a" < "b" #=> true
"a" > "b" #=> false
"a" < "B" #=> false
"A" < "B" #=> true
"A" < "b" #=> true
"A" < "z" #=> true
"z" < "A"
答案 0 :(得分:4)
检查条件时,它会转换为ASCII码,然后比较结果。这是link
"a" < "b"
=> true
When it converts so a = 97 & b = 98 In ASCII
And 97 < 98 which is true
"a" > "b"
=> false
When it converts so a = 97 & b = 98 In ASCII
And 97 > 98 which is false
"a" < "B"
=> false
When it converts so a = 97 & B = 66 In ASCII
And 97 < 66 which is false
"A" < "B"
=> true
When it converts so A = 65 & B = 66 In ASCII
And 65 < 66 which is true
"A" < "b"
=> true
When it converts so A = 65 & b = 98 In ASCII
And 65 < 98 which is true
我希望你明白我的观点
答案 1 :(得分:3)
据我所知,标准Ruby和Rubinius比较字符串,因为它们保存在内存中。
在C-Ruby中:
retval = memcmp(ptr1, ptr2, lesser(len1, len2))
在Rubinius中:
@data.compare_bytes(other.__data__, @num_bytes, other.bytesize)
还有一些额外的检查(例如,如果other
也是一个字符串或者编码是否兼容),但在比较"a"
和"b"
时,Ruby基本上会比较"a".bytes
和"b".bytes
。
String#bytes
返回一个整数数组。在Ruby中,默认情况下Arrays不具有可比性,因此您可以启动
class Array
include Comparable
end
在控制台中使用"a".bytes < "b".bytes
之前。
作为字符串的数组根据lexicographical order进行比较。
举个例子:
class Array; include Comparable; end
p "a".bytes
# [97]
p "b".bytes
# [98]
p "a".bytes < "b".bytes
# true
p "a" < "b"
# true
p "B".bytes
# [66]
p "a".bytes < "B".bytes
# false
比较ASCII字符串时,它符合@AniketShivamTiwari提供的描述。
最后,这种行为并非特定于Ruby。在Linux文件夹中,大写文件名在小写文件名之前排序(至少在LC_COLLATE="C"
时)。
答案 2 :(得分:0)
它是角色字节值的比较。您可以使用bytes
方法查看char的原始字节值:
'B'.bytes
=> [66]
'a'.bytes
=> [97]
现在您可以看到为什么'B'
小于'a'