3

我有三个哈希:

a = {key:"value"}
b = {"key"=>"value"}
c = {:key=>"value"}

这些结果:

a.has_key?("key") # => false
b.has_key?("key") # => true
c.has_key?("key") # => false

我的问题是:

  • 为什么?这是什么行为?
  • 我怎样才能得到ab并为所有这些使用相同的语法c返回?true
4

3 回答 3

18

有字符串,也有符号。字符串不是符号。

这些哈希包含一个符号作为键:

{key: "value"}
{:key => "value"}

此哈希包含一个字符串作为键:

{"key"=>"value"}

这就是为什么你的测试表现得像他们一样。

Rails 有一个 Hash 包装器,称为HashWithIndifferentAccess。如果您有其中之一,则可以通过字符串或符号访问值。但是对于常规哈希,有区别。

require "active_support/core_ext"

h = {key: "value"}.with_indifferent_access

h.has_key?(:key) # => true
h.has_key?("key") # => true
于 2013-11-06T10:45:24.613 回答
2

如果您在分配哈希时观察,在 IRB 中它们是这样的:

2.0.0p247 :014 > a = {key:"values"}
 => {:key=>"values"} 
2.0.0p247 :015 > b = {"key" => "values"}
 => {"key"=>"values"} 
2.0.0p247 :016 > c = {:key => "value"}
 => {:key=>"value"} 

我们可以看到ac是相同的,除了用于分配的语法。用于的语法c我猜是旧语法。

a = {key:"values"} 

是最新 Ruby 版本中引入的语法。在 hashac中,键都是a符号。

Ruby Symbols and Strings之间的区别”解释了字符串和符号之间的区别,而在散列b中,键值是一个字符串。显然它的价值是“关键”。主要区别在于 hash 的 key 值b是可变的,而在 hash 的情况下则不是a

于 2013-11-06T11:04:58.187 回答
0

:key您应该使用hasha和的符号c

a = {key: "value"}
b = {"key" => "value"}
c = {:key => "value"}
a.has_key? :key # => true
b.has_key? :key # => false
c.has_key? :key # => true

{key:"value"}相当于{:key=>"value"}

于 2013-11-06T10:43:42.967 回答