为什么`" a" < " b"`相等`是真的`?

时间:2017-10-23 11:59:19

标签: ruby string

有人可以解释以下代码的工作原理吗?

"a" < "b" #=> true 
"a" > "b" #=> false 
"a" < "B" #=> false 
"A" < "B" #=> true 
"A" < "b" #=> true 
"A" < "z" #=> true 
"z" < "A"

3 个答案:

答案 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)

据我所知,标准RubyRubinius比较字符串,因为它们保存在内存中。

在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'