允许使用Ruby 1.9';什么是散列语法?

允许使用Ruby 1.9';什么是散列语法?,ruby,Ruby,虽然我已经使用Ruby 1.9一段时间了,但我最近才发现现在支持的较新的哈希语法: settings = { host: "localhost", port: 5984 } 与之相反: settings = { "host" => "localhost" } 我喜欢它与JavaScript的object noation相似,看起来有点像JSON,所以我可能会在我的所有库中使用它,但我仍然希望支持其他用户和我自己的项目,它们采用旧语法 因此,它实际上归结为一个相当简单的问题,

虽然我已经使用Ruby 1.9一段时间了,但我最近才发现现在支持的较新的哈希语法:

settings = {
  host: "localhost",
  port: 5984
}
与之相反:

settings = {
  "host" => "localhost"
}
我喜欢它与JavaScript的object noation相似,看起来有点像JSON,所以我可能会在我的所有库中使用它,但我仍然希望支持其他用户和我自己的项目,它们采用旧语法

因此,它实际上归结为一个相当简单的问题,即必须同时测试符号和字符串。有没有一种简单的方法可以将这两条线作为一条线来完成

return true if settings["host"] and settings["db"]

return true if settings[:host] and settings[:db]
ActiveSupport(来自Rails)提供。您需要显式地使用它,而不是标准的哈希

不过,请注意,该类本身有一句话:

这个类有可疑的语义,我们只有让人们 可以写params[:key]而不是params['key'],它们得到相同的结果 两个键的值


即使在Ruby<1.9中,也可以使用符号作为键。例如:

# Ruby 1.8.7
settings = { :host => "localhost" }
puts settings[:host] #outputs localhost
settings.keys[0].class # => Symbol
Ruby1.9改变了创建哈希的方式。它接受密钥并为您将其转换为符号,同时消除了散列火箭的需要

# Ruby 1.9.2
settings = { host: "localhost" }
settings[:host] # => "localhost"
settings.keys[0].class # => Symbol
在这两种情况下,如果我尝试使用
settings[“name”]
访问
settings[:name]
,我将得到零。Ruby1.9所做的就是允许一种新的创建哈希的方法。为了回答您的问题,据我所知,如果您想要向后兼容Ruby 1.8,就不能使用新的
{key:value}
语法

因此,它实际上归结为一个相当简单的问题,即必须同时测试符号和字符串。有没有一种简单的方法可以将这两条线作为一条线来完成

return true if settings["host"] and settings["db"]

return true if settings[:host] and settings[:db]
我不确定你到底在问什么,因为这似乎与最初的标题并不完全相关,但请尝试:

# somewhere you get the values you are going to need to look up...
host = 'foo'
db = 'bar'
# then code goes by...
return true if settings[host.to_sym] and settings[db.to_sym]

# later you assign a symbol to one of the keys:
host = :foo
# more code goes by...
return true if settings[host.to_sym] and settings[db.to_sym]
都一样。让Ruby根据需要将字符串转换为符号

这是因为:

'foo'.to_s   # => "foo"
:foo.to_s    # => "foo"
'foo'.to_sym # => :foo
:foo.to_sym  # => :foo

您可以选择是使用符号还是字符串作为散列键,然后让Ruby进行排序。

我应该注意-我知道符号和字符串是不同的,这是有原因的,我用这两行代码做的事情非常不同,但为了向新语法靠拢,我基本上是假装它都是一样的。只是希望你的用户总是使用符号作为键(他们应该这样做),就像肖恩·希尔解释的那样。@dominikh,新语法甚至不会在Ruby 1.8上解析。以下内容来自ree-1.8.7:
settings={host:“localhost”}
SyntaxError:compile error(irb):89:Hash设置的奇数列表={host:“localhost”}^(irb):89:语法错误,意外的“:”,预期的“}”
我认为他混淆了两个不同的问题。1) 字符串vs符号键和Ruby的新哈希语法。嗯,我想我当时误解了你的部分问题,因为我认为这只是关于字符串vs符号的问题。如果您想支持1.8.x用户,则不能在代码中使用新的哈希语法(称为哈希火箭)。编辑:嗯,这让我把两个不同的人弄糊涂了:)我的两条评论仍然有效。如果你试图使用1.9之前的“=>”语法,rubocop语法检查器就会冒犯你。使用{key:value}而不是{:key=>value}会让rubocop很开心。我想我不同意在Ruby1.8中只使用符号作为键是正确的,即使是传统的。不过,使用新语法,它似乎总是正确的。我想我会在我的hash子类上重载[]操作符,因为兼容性很重要。虽然我通常不喜欢绝对值,但我想说它更喜欢使用符号,因为它比使用字符串有内存优势。创建符号时,将创建on实例;然而,当您使用一个字符串时,就会创建一个新实例。通过执行
10.times{puts“hello”.object\u id;puts:hello.object\u id}
每个字符串的object\u id都会更改,但符号的object\u id永远不会更改。从rails 3开始,该引号就消失了。此外,新网站是