我有一个场景,当我尝试使用符号访问哈希键时,它不起作用,但是当我使用字符串访问它时,它工作正常。 据我了解,建议使用符号而不是字符串,因此我正在尝试清理我的脚本。 我在脚本的其他地方使用哈希符号,只是这个特定场景不起作用。
这是片段:
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
您从文件中读入的密钥是一个字符串。实际上,您从文件中读取的所有内容都是一个字符串。如果您希望哈希中的键是符号,则可以更新脚本,改为执行以下操作:
account_params[hkey.to_sym] = hvalue
这会将"hkey"转换为符号,而不是使用字符串值。
Ruby 提供了多种这些类型的方法,这些方法会将值强制转换为不同的类型。例如:to_i会把它变成一个整数,to_f到一个浮点数,to_s会把一些东西带回一个字符串值。
您可以使用此Mix-In:https://gist.github.com/3778285
这会将"具有冷漠访问权限的哈希"行为添加到现有的单个哈希实例,无需复制或复制该哈希实例。 这在您的情况下非常有用,当从文件读取时,或者从 Redis 读取参数哈希时也是如此。
有关更多详细信息,请参阅Gist中的评论。
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]