假设我有一个数据结构的代码块:
users = {
admin: "secret",
admin2: "secret2",
admin3: "secret3"
}
当我尝试访问特定键的值时:users[:admin]
,我得到nil
的返回值,但是如果我使用这种语法:users['admin']
,我会获得"secret"
的返回值。为什么会这样?根据文档,Aren认为这两种语法是等价的。
附带问题:当我为此数据结构创建.yml
文件时,我尝试将其设置为:
{
"admin" => "secret",
"admin2" => "secret2",
"admin3" => "secret3"
}
我无法加载("解析")此文件并收到此错误:
找不到预期的','或者'}'}在第1行第1列解析流映射时
但是开头的代码块完全没问题。再一次,我认为语法应该是等效的或执行相同的功能。为什么会这样?我认为我在这一点上编码的最薄弱点是哈希,因为这让我很困惑。
提前致谢!
答案 0 :(得分:1)
@Borsunho说明:admin
和"admin"
不相同是正确的。如果你来自铁轨背景而不理解红宝石,那么由于params
Hash并不关心,这可能令人困惑。这是因为params
是一个名为HashWithIndifferentAccess
的特殊类。
实现这一点并不困难,但除了问题之外。
至于你的yml文件应该是:
:admin: "secret"
:admin2: "secret2"
:admin3: "secret3"
这将解析与原始Hash
相同的内容。语法非常不同,因为yml是一种存储数据结构的方式,并且独立于ruby或其任何语法规则。
前导冒号表示这是一个符号,否则键将被解析为字符串。
e.g。
require 'yaml'
yml = <<YML
:admin: "secret"
:admin2: "secret2"
:admin3: "secret3"
YML
YAML.load(yml)
#=> {:admin=>"secret", :admin2=>"secret2", :admin3=>"secret3"}
yml = <<YML
admin: "secret"
admin2: "secret2"
admin3: "secret3"
YML
YAML.load(yml)
#=> {"admin"=>"secret", "admin2"=>"secret2", "admin3"=>"secret3"}
答案 1 :(得分:0)
:admin
是Symbol
。 'admin'
是String
。哈希不会将它们视为相同的密钥,即使它们看起来相似。
答案 2 :(得分:0)
首先:
您的第一个代码示例
users = { admin: "secret" }
与
不同users = { "admin" => "secret" }
第一个符号作为键。你知道这个,因为它使用key: val
语法。每当键不是符号时,它们将使用第二个示例中的“哈希火箭”语法。这里的第二个例子有字符串作为键。
所以你要为第一个例子说users[:admin]
,为第二个例子说users["admin"]
。
继续关于yaml的问题:您的示例代码无效yaml。你不能只将ruby代码复制并粘贴到yaml中;他们有完全不同的语法。您可以运行puts YAML.dump(ruby_object)
来查看散列的YAML是什么样的。