web-dev-qa-db-ja.com

デフォルトで文字列キーを使用してハッシュを作成する方法

私が次のことをすると:

h = { "a": 123 }

Ruby/Railsはキーを自動的に記号に変換します。

h[:a]  # => 123
h["a"] # => nil

この動作を防ぐにはどうすればよいですか?文字列キーでハッシュを作成しましたが、常にHash#stringify_keysを呼び出さなくても、ハッシュをそのまま保持したいと考えています。

13
Joerg

ハッシュロケット構文を使用します。

h = { "a" => 123 }
#=> {"a"=>123}
h['a']
#=> 123
18
Andrey Deineko

コロンの代わりにハッシュロケットを使用する:

h = { "a" => 123 }
#=> {"a"=>123}
4
Deepak Mahakale

試す

h = { "a" => 123 }

コロンはあなたの鍵をシンボルにします。

2
Ursus

誤解を解消するには:

文字列キーがシンボルに変更されると、混乱/苛立ちます

そもそも文字列ではありませんでした。これは、記号キーを作成するためのもう1つの構文です。検討してください:

:'foo-bar'.class # => Symbol

時々、まったく異なるもののように見える文字がシンボル内に存在する可能性があるという考えです。

たとえば、上記の引用符なしの場合は"リテラルシンボル:fooを作成し、そこからローカル変数/メソッドの呼び出し結果bar"を減算します。以前は、String#to_symを使用する以外に、そのようなシンボルを作成する方法はありませんでした。そして、あなたはこれがひどく見えることに同意しなければなりません:

{'foo-bar'.to_sym => 42, :this_now_needs_rocket_notation => 'baz'}

一般的に引用は文字列の作成を意味するのではなく、現状のままを意味する、および/または何かの境界を定義します。したがって、偶然にもリテラル文字列構文には多くの意味がありますが、これが唯一のアプリケーションではありません。

1
ndnenkov