2

我有一个场景,当我尝试使用符号访问哈希键时它不起作用,但是当我使用字符串访问它时它工作正常。据我了解,建议使用符号而不是字符串,因此我正在尝试清理我的脚本。我在脚本的其他地方使用哈希符号,只是这个特定的场景不起作用。

这是片段:

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
4

2 回答 2

3

您从文件中读取的键是一个字符串。事实上,您从文件中读取的所有内容都是一个字符串。如果您希望散列中的键是符号,您可以更新脚本来代替:

account_params[hkey.to_sym] = hvalue

这会将“hkey”变成一个符号,而不是使用字符串值。

Ruby 提供了多种这些类型的方法,它们会将值强制转换为不同的类型。例如:to_i 将其转换为整数,to_f 转换为浮点数,to_s 将返回字符串值。

于 2012-04-11T02:06:45.310 回答
0

你可以使用这个 Mix-In:https ://gist.github.com/3778285

这将为现有的单个哈希实例添加“具有无关访问的哈希”行为,而无需复制或复制该哈希实例。这在您的情况下很有用,在从 File 读取时,或者在从 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]
于 2012-09-24T21:09:28.340 回答