哈希和不同的语法:在尝试访问键值时将nils作为返回值

时间:2016-09-12 20:15:26

标签: ruby

这里的初学者程序员已经在这里工作了几个月。

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

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

当我尝试访问特定键的值时:users[:admin],我得到nil的返回值,但是如果我使用这种语法:users['admin'],我会获得"secret"的返回值。为什么会这样?根据文档,Aren认为这两种语法是等价的。

附带问题:当我为此数据结构创建.yml文件时,我尝试将其设置为:

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

我无法加载("解析")此文件并收到此错误:

  

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

但是开头的代码块完全没问题。再一次,我认为语法应该是等效的或执行相同的功能。为什么会这样?我认为我在这一点上编码的最薄弱点是哈希,因为这让我很困惑。

提前致谢!

3 个答案:

答案 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)

:adminSymbol'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是什么样的。