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はfloatに、to_sは何かを文字列値に戻します。

于 2012-04-11T02:06:45.310 に答える
0

このミックスインを使用できます: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]
于 2012-09-24T21:09:28.340 に答える