为什么使用哈希符号的时候,而不是一个散列字符串做我的代码休息?(Why does my code b

2019-09-16 11:37发布

我有一种情况,当我尝试访问使用符号不工作的哈希键,但是当我用绳子访问它,它工作正常。 这是一个符号建议在琴弦我的理解,所以我试图清理我的脚本。 我用我的脚本的其他地方使用哈希符号,它仅仅是行不通这种特定情况。

下面是摘录:

account_params ={}
File.open('file', 'r') do |f|
  f.each_line do |line|
    hkey, hvalue = line.chomp.split("=")
    account_params[hkey] = hvalue
  end
end

account_scope = account_params["scope"]

这工作,但如果我用它没有一个符号,如下图所示:

account_scope = account_params[:scope]

当我使用一个符号,我得到:

can't convert nil into String (TypeError)

我不知道,如果它的问题,但这个特定的哈希值的内容看起来是这样的:

12345/ABCD123/12345

Answer 1:

你从文件中读取的关键是一个字符串。 事实上,你从文件中读取的一切是一个字符串。 如果你想的钥匙,你的散列是符号,您可以更新脚本中做到这一点,而不是:

account_params[hkey.to_sym] = hvalue

这将打开“HKEY”成符号,而不是使用字符串值。

Ruby提供多种这些类型的,这将迫使值插入到一个不同类型的方法的。 例如:to_i将它带到一个整数,to_f的浮动,而to_s将采取一些回字符串值。



Answer 2:

你可以使用这种混合式: https://gist.github.com/3778285

这将增加“哈希随着冷漠访问”行至现有的单哈希实例,不复制或复制该散列实例。 从文件读取,或者也读从Redis的参数哈希情况而言,这样可以在你的情况下非常有用。

看到里面要点的意见更多的细节。

require 'hash_extensions' # Source: https://gist.github.com/3778285

account_params = {'name' => 'Tom' } # a regular Hash

class << account_params
  include Hash::Extensions::IndifferentAccess  # mixing-in Indifferent Access on the fly
end

account_params[:name] 
 => 'Tom'
account_params.create_symbols_only # (optional) new keys will be created as symbols
account_params['age'] = 22
 => 22
account_params.keys
 => ['name',:age]


文章来源: Why does my code break when using a hash symbol, instead of a hash string?