我有两个看似相同的字符串:
context = "Marriott International World’s Most ADMIRED Lodging Company by FORTUNE for 14th yr. via @FortuneMagazine http://cnnmon.ie/1kcFZSQ"
slice_str = context.slice(105,24) # => "http://cnnmon.ie/1kcFZSQ"
str = "http://cnnmon.ie/1kcFZSQ"
slice_str == str # => true
slice_str.eql? str # => true
但是当我在哈希中查找键是字符串的值时,它们在Ruby 2.1.0和Ruby 2.1.1中没有返回相同的东西:
redirects = {"http://cnnmon.ie/1kcFZSQ"=>""}
redirects.key?(slice_str) # => false
redirects.key?(str) # => true
这种行为有什么解释? Ruby 1.9.3按预期工作。
答案 0 :(得分:1)
这是ruby中的一个错误< 2.1.3
$ rvm use 2.1.2
Using /Users/richniles/.rvm/gems/ruby-2.1.2
$ irb
2.1.2 :001 > context = "Marriott International World’s Most ADMIRED Lodging Company by FORTUNE for 14th yr. via @FortuneMagazine http://cnnmon.ie/1kcFZSQ"
=> "Marriott International World’s Most ADMIRED Lodging Company by FORTUNE for 14th yr. via @FortuneMagazine http://cnnmon.ie/1kcFZSQ"
2.1.2 :002 > slice_str = context.slice(105,24) # => "http://cnnmon.ie/1kcFZSQ"
=> "http://cnnmon.ie/1kcFZSQ"
2.1.2 :003 > str = "http://cnnmon.ie/1kcFZSQ"
=> "http://cnnmon.ie/1kcFZSQ"
2.1.2 :004 > redirects = {"http://cnnmon.ie/1kcFZSQ"=>""}
=> {"http://cnnmon.ie/1kcFZSQ"=>""}
2.1.2 :005 > redirects.key?(slice_str)
=> false
2.1.2 :006 > redirects.key?(str)
=> true
但在ruby 2.1.3中也是如此:
$ rvm use 2.1.3
Using /Users/richniles/.rvm/gems/ruby-2.1.3
$ irb
2.1.3 :001 > context = "Marriott International World’s Most ADMIRED Lodging Company by FORTUNE for 14th yr. via @FortuneMagazine http://cnnmon.ie/1kcFZSQ"
=> "Marriott International World’s Most ADMIRED Lodging Company by FORTUNE for 14th yr. via @FortuneMagazine http://cnnmon.ie/1kcFZSQ"
2.1.3 :002 > slice_str = context.slice(105,24) # => "http://cnnmon.ie/1kcFZSQ"
=> "http://cnnmon.ie/1kcFZSQ"
2.1.3 :003 > str = "http://cnnmon.ie/1kcFZSQ"
=> "http://cnnmon.ie/1kcFZSQ"
2.1.3 :004 > redirects = {"http://cnnmon.ie/1kcFZSQ"=>""}
=> {"http://cnnmon.ie/1kcFZSQ"=>""}
2.1.3 :005 > redirects.key?(slice_str)
=> true
2.1.3 :006 > redirects.key?(str)
=> true
答案 1 :(得分:0)
对于Hash
个密钥,其key#hash
方法确定密钥是否相等。
在ruby 2.1.1中,对于您的示例,这两个字符串哈希 不同:
slice_str.hash == str.hash # => false in Ruby 2.1.1
虽然,我完全不清楚,为什么切片的字符串有不同的哈希值。
甚至更奇怪 - 我发现如果你在仅ASCII字符串上测试代码(你的字符串,但用'
而不是’
) - 哈希将是相同的!
真的很奇怪。
我找到的唯一解决方案(尽管它看起来并不优雅):
slice_str = context.slice(105,24).chars.join # split it into separate chars and then join back
p str.hash == slice_str.hash # true now
p redirects.key?(slice_str) # true now
UPD :哎呀,我在上面的评论中没有看到bug的链接:(