使用hash without =>时,没有将nil隐式转换为String

时间:2017-12-12 12:16:05

标签: ruby

我的程序使用此哈希工作正常

hash = 
    {
    'keyone'=> 'valueone',
    'keytwo'=> 'valuetwo',
    'keythree'=> 'valuethree'
    }

但是有人指出这个符号已经过时了,现在我应该使用:

  hash = 
        {
        'keyone': 'valueone',
        'keytwo': 'valuetwo',
        'keythree': 'valuethree'
        }

我收到此错误:

no implicit conversion of nil into String (TypeError)

我只更改了哈希表示法。 有人可以解释发生了什么吗?

3 个答案:

答案 0 :(得分:2)

在后者中,您的键被保存为符号。所以你应该把它们称为:

hash[:keyone]

如果符号很好,那就更好了

hash = {
  keyone: 'valueone',
  keytwo: 'valuetwo',
  keythree: 'valuethree'
}

但是,如果你需要字符串键,你必须坚持使用“旧”语法

hash = {
  'keyone' => 'valueone',
  'keytwo' => 'valuetwo',
  'keythree' => 'valuethree'
}

答案 1 :(得分:1)

  

我只更改了哈希表示法。

不,你没有。您还将关键对象的类型从String更改为Symbol s。

{ 'key': 'value' }

等同于

{ 'key' => 'value' }

等同于

{ :key => 'value' }

答案 2 :(得分:0)

new notation使用符号符号:

hash = {
    keyone: 'valueone',
    keytwo: 'valuetwo',
    keythree: 'valuethree'
}
puts hash
# {:keyone=>"valueone", :keytwo=>"valuetwo", :keythree=>"valuethree"}

您的代码也会错过项目之间的逗号。