1. ホーム
  2. ruby

[解決済み] key => "value"`と`key: "value"`のハッシュ表記に違いはありますか?

2022-07-27 13:15:08

質問

の違いは何ですか? :key => "value" (hashrocket)と key: "value" (Ruby 1.9)記法と同じですか?

もしそうでなければ、私は key: "value" という表記にしたいです。からの変換を手助けするgemはありますか? :x => から x: という表記に変更しますか?

どのように解決するのですか?

はい、違います。これらは合法です。

h = { :$in => array }
h = { :'a.b' => 'c' }
h[:s] = 42

となっていますが、これらは

h = { $in: array }
h = { 'a.b': 'c' } # but this is okay in Ruby2.2+
h[s:] = 42

また、何でもキーとして使用できるように => を使えば、こんなこともできます。

h = { C.new => 11 }
h = { 23 => 'pancakes house?' }

が、こんなことはできません。

h = { C.new: 11 }
h = { 23: 'pancakes house?' }

JavaScriptのスタイル( key: value ) は、Hash のキーがすべて "simple" シンボルである場合のみ有効です (多かれ少なかれ、以下のものにマッチします。 /\A[a-z_]\w*\z/i にマッチするもので、AFAIKではパーサーはこれらのキーのためにラベルパターンを使用します)。

:$in のスタイル記号は MongoDB を使うときに結構出てくるので、MongoDB を使っていると Hash のスタイルが混ざってしまうことになります。また、Hash の特定のキーを扱うことがあれば ( h[:k] ) の特定のキーを扱う場合、ハッシュ全体ではなく ( h = { ... } ) を使用する場合でも、記号にはコロンファーストのスタイルを使用しなければなりません。また、Hash 以外で使用する記号にはリーディングコロンのスタイルを使用しなければなりません。私は一貫性を保つことを好むので、JavaScriptのスタイルに悩まされることはまったくありません。

JavaScript スタイルの問題のいくつかは Ruby 2.2 で修正されました。例えば、有効なラベルでないシンボルがある場合、引用符を使うことができるようになりました。

h = { 'where is': 'pancakes house?', '$set': { a: 11 } }

しかし、キーがシンボルでない場合はまだhashrocketが必要です。