Ruby 2.3:
例1では、文字列キー"a"
は自動的にシンボルに変換されますが、例2では文字列のままです。
例1
{"a": 1}
# => {:a=>1}
例2
{"a"=>"c"}
# => {"a"=>"c"}
:
は古いスタイルのハッシュロケットと同じ=>
構文。何が起こっている? Railsでこれに気付いたことがないのはなぜですか?これを隠しているのはHashWithIndifferentAccess
ですか?
Ruby 2.3(.0)では、これらはすべて同じです。
{:"a" => 1}
{"a": 1},
{:a => 1}
{a: 1}
これらはすべて同じものに変換されます。a
は、これらすべての場合のシンボルです。
{"a"=>1}
は異なります。a
はこの場合の文字列です。
これは、Ruby 1.9で導入された新しいハッシュ構文です。コロンを使用した構文は、シンボルキーのみで機能します。「オブジェクトへのシンボル」ハッシュと呼ばれ、最も一般的なスタイルの唯一の構文糖もう1つのポイントは、javascriptオブジェクト表記に近いということです。
キータイプが混在している場合は、古いスタイル(ハッシュロケット構文)を好みますが、それはあなた次第です。 2つのスタイルを混在させると、見苦しくなります。
Rubyドキュメント によると:
Blockquote Symbolオブジェクトは、Rubyインタープリター内の名前といくつかの文字列を表します。これらは、:nameおよび: "string"リテラル構文を使用して、さまざまなto_symメソッドによって生成されます。
これは、次を実行することを意味します。
$ Ruby -e Ruby -e "h = {key: \"value\"}; puts h"
$ Ruby -e Ruby -e "h = {:key => \"value\"}; puts h"
$ Ruby -e Ruby -e "h = {\"key\": \"value\"}; puts h"
$ Ruby -e Ruby -e "h = {:\"key\" => \"value\"}; puts h"
$ Ruby -e Ruby -e "h = {\"#{:key}\": \"value\"}; puts h"
同じ結果が得られます。
$ {:key=>"value"}