1. { :a => 10 } #=> no error
2. { a: 10 } #=> no error
3. { :"str" => 10 } #=> no error
4. { "str": 10 } #=> syntax error, unexpected ':', expecting =>
4. は 2 と同じではありませんか? 2 が機能し、4 が構文エラーをスローするのはなぜですか?
1. { :a => 10 } #=> no error
2. { a: 10 } #=> no error
3. { :"str" => 10 } #=> no error
4. { "str": 10 } #=> syntax error, unexpected ':', expecting =>
4. は 2 と同じではありませんか? 2 が機能し、4 が構文エラーをスローするのはなぜですか?
私の理解では、それが意味するのか、それとも意味するのか{"key": value}
が明確ではないため、有効な構文ではありません。{:"key" => value}
{"key" => value}
これについてはここで議論があります。ディスカッションでの Matz からの引用
| | もし {'key': 'value'} が {:key => 'value'} を意味する場合、異論はありません。
| | それは誤解を招きませんか?OPは {'key': 'value'} が {'key' => 'value} を意味することを望んでいると思います
しかし、{key: "value"} が {:key => "value"} の省略形であることを考えると、{"key": "value"} は {:"key" => "value" の省略形であるべきです。 }。その上、JSON を思い出すので、a: と "a": を別のものにすると、上記の誤解よりも混乱を招く可能性があります。
matz.
Hash
: ハッシュは、キーが常にシンボルである場合に代替構文形式を許可します。
options = { :font_size => 10, :font_family => "Arial" }
次のように記述できます。
options = { font_size: 10, font_family: "Arial" }
最初の 3 つのケースはすべてキー位置のシンボルですが、4 番目は文字列インスタンスであり、キーとしてのシンボル インスタンスではありません。これが、4 番目のケースが無効な Ruby 構文である理由です。
{ :a => 10 }.keys[0].class # => Symbol
{ a: 10 }.keys[0].class # => Symbol
{ :"str" => 10 }.keys[0].class # => Symbol
(1) は標準シンボル、(2) はシンボル キー ハッシュの省略形 1.9 構文、(3) "str".to_sym の省略形、(4) は存在せず、hashrocket を使用する必要があります。