散列和不同的语法:在尝试访问键值时获取nil作为返回值



初学的程序员。

假设我有一个数据结构的代码块:

users = {
admin: "secret",
admin2: "secret2",
admin3: "secret3"
}

当我尝试访问特定键的值时,如:users[:admin],我得到nil的返回值,但如果我使用这种语法:users['admin'],我将得到"secret"的返回值。为什么会发生这种情况?根据文档,这两种语法不应该是等价的吗?

侧面问题:当我为这个数据结构创建一个.yml文件时,我试着这样设置它:

{
"admin" => "secret",
"admin2" => "secret2",
"admin3" => "secret3"
}

我将无法加载("解析")这个文件,并得到这个错误:

在解析第1行第1列的流映射时没有找到预期的','或'}'

但是开头的代码块是完全没问题的。再一次,我认为语法应该是等价的,或者执行相同的功能。为什么会发生这种情况?我认为我在编码中最薄弱的地方是哈希,因为这让我很困惑。

提前感谢!

@Borsunho说:admin"admin"不相等是正确的。如果你有rails背景,不懂ruby,这可能会令人困惑,因为params哈希并不关心。这是因为params是一个叫做HashWithIndifferentAccess的特殊类。

实现这个并不太难,但这是无关紧要的。

对于您的yml文件,它应该是:

:admin: "secret"
:admin2: "secret2"
:admin3: "secret3"

这将解析出与原始Hash相同的内容。语法是非常不同的,因为yml是一种存储数据结构的方式,并且独立于ruby或它的任何语法规则。

前面的冒号表示这是一个符号,否则键将被解析为字符串。

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"}    

:adminSymbol'admin'是一个String。即使它们看起来很相似,散列也不会将它们视为相同的键。

开头:

您的第一个代码示例

users = { admin: "secret" }

不一样
users = { "admin" => "secret" }

第一个以符号作为键。您知道这一点是因为它使用了key: val语法。当键不是符号时,它们将在第二个示例中使用"散列火箭"语法。这里的第二个示例使用字符串作为键。

第一个例子是users[:admin]第二个例子是users["admin"]

继续你关于yaml的问题:你的示例代码不是有效的yaml。你不能只是把ruby代码复制粘贴到yaml中;它们的语法完全不同。您可以运行puts YAML.dump(ruby_object)来查看用于散列的YAML是什么样的。