允许Ruby 1.9的哈希语法?

Cer*_*era 3 ruby

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

settings = {
  host: "localhost",
  port: 5984
}
Run Code Online (Sandbox Code Playgroud)

相反:

settings = {
  "host" => "localhost"
}
Run Code Online (Sandbox Code Playgroud)

我喜欢它与JavaScript的对象符号的相似性,看起来有点像JSON,所以我可能会切换到使用它与我的所有库,但我仍然希望支持其他用户和我自己的项目,它们采用旧的语法.

所以它真的归结为一个相当简单的问题,即必须测试符号和字符串.是否有一种简单的方法可以将这两条线作为一条线进行?

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

return true if settings[:host] and settings[:db]
Run Code Online (Sandbox Code Playgroud)

Sea*_*ill 5

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

# Ruby 1.8.7
settings = { :host => "localhost" }
puts settings[:host] #outputs localhost
settings.keys[0].class # => Symbol
Run Code Online (Sandbox Code Playgroud)

Ruby 1.9改变了创建哈希的方式.它需要密钥并将其转换为符号,同时不需要哈希火箭.

# Ruby 1.9.2
settings = { host: "localhost" }
settings[:host] # => "localhost"
settings.keys[0].class # => Symbol
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,如果我尝试访问settings[:name]使用settings["name"],我会得到零.所有Ruby 1.9都允许创建哈希的新方法.要回答你的问题,{key: value}如果你想向后兼容Ruby 1.8 ,你不能使用新的语法.

  • 虽然我一般不喜欢绝对,但我会说因为它的内存优于使用字符串,所以最好使用符号.创建符号时,会在实例上创建; 而当您使用字符串时,会创建一个新实例.您可以通过执行`10.times {puts"hello".object_id; puts:hello.object_id}`每个字符串的object_id都会改变,但符号的object_id永远不会改变. (4认同)