web-dev-qa-db-ja.com

ハッシュ内のこの文字列キーがシンボルに変換されるのはなぜですか?

Ruby 2.3:

例1では、文字列キー"a"は自動的にシンボルに変換されますが、例2では文字列のままです。

例1

{"a": 1}
# => {:a=>1} 

例2

{"a"=>"c"}
# => {"a"=>"c"}

:は古いスタイルのハッシュロケットと同じ=>構文。何が起こっている? Railsでこれに気付いたことがないのはなぜですか?これを隠しているのはHashWithIndifferentAccessですか?

33
Nona

Ruby 2.3(.0)では、これらはすべて同じです。

{:"a" => 1}
{"a": 1},
{:a => 1}
{a: 1} 

これらはすべて同じものに変換されます。aは、これらすべての場合のシンボルです。

{"a"=>1}は異なります。aはこの場合の文字列です。

38
Zabba

これは、Ruby 1.9で導入された新しいハッシュ構文です。コロンを使用した構文は、シンボルキーのみで機能します。「オブジェクトへのシンボル」ハッシュと呼ばれ、最も一般的なスタイルの唯一の構文糖もう1つのポイントは、javascriptオブジェクト表記に近いということです。

キータイプが混在している場合は、古いスタイル(ハッシュロケット構文)を好みますが、それはあなた次第です。 2つのスタイルを混在させると、見苦しくなります。

6
guitarman

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"}
1
Renato Damas