web-dev-qa-db-ja.com

`:key =>" value "`と `key:" value "`ハッシュ表記に違いはありますか?

:key => "value"(ハッシュロケット)とkey: "value"(Ruby 1.9)の表記に違いはありますか?

そうでない場合は、key: "value"表記を使用します。 :x =>からx:表記に変換するのに役立つgemはありますか?

116
AdamNYC

はい、違いがあります。これらは合法です:

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)は、すべてのハッシュキーが「単純な」シンボル(/\A[a-z_]\w*\z/iにほぼ一致するもの、パーサーがこれらのキーのラベルパターンを使用している場合)である場合にのみ役立ちます。

MongoDBを使用すると、:$inスタイルシンボルがかなり表示されるため、MongoDBを使用するとハッシュスタイルが混在することになります。また、ハッシュ全体(h[:k])ではなく、ハッシュ(h = { ... })の特定のキーを使用する場合、シンボルにはコロンファーストスタイルを使用する必要があります。また、ハッシュ以外で使用するシンボルには、先頭のコロンスタイルを使用する必要があります。一貫性を保つことを好み、JavaScriptスタイルにまったく煩わされません。

JavaScriptスタイルの問題の一部は、Ruby 2.2で修正されました。有効なラベルではないシンボルがある場合は、引用符を使用できます。

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

ただし、キーがシンボルでない場合は、まだハッシュロケットが必要です。

145
mu is too short

key: "value"は、Ruby 1.9;の便利な機能です。環境がそれをサポートしている限り、使用しない理由はありません。ロケットよりもコロンを入力する方がはるかに簡単です。変換を行うためのgemがあることに関しては、おそらくそうではありませんが、ファイル操作と正規表現をまだ知らない場合、それはあなたにとって理想的な学習体験のようです。

10
ranksrejoined

key: value JSONスタイルの割り当ては、新しいRuby 1.9ハッシュ構文の一部であるため、この構文はRubyの古いバージョンでは機能しないことに注意してください。また、キーはこれらの2つの制約に耐えることができる場合、新しいハッシュは古いハッシュのように機能します;それらを変換する理由(おそらくスタイル以外)はありません。

4
sczizzo

ハッシュロケットによって割り当てられたRubyハッシュキーは、キーと値のペア(eg's' => x)の文字列を容易にすることができますが、symbolsegkey: "value"または:key => "value"は文字列に割り当てることができません。 ハッシュロケットはハッシュテーブルに自由と機能を提供しますが、具体的にはキーとして文字列を許可します、アプリケーションのパフォーマンスはハッシュテーブルを使用する場合よりも遅くなる可能性がありますシンボルをハッシュキーとして構築します。次のリソースは、ハッシュロケットとシンボルの違いを明確にすることができる場合があります。

3

:key => valueを実行することはkey: valueを実行することと同じであり、本当に便利です。私は=>を使用する他の言語を見たことはありませんが、Javascriptのような他の言語はHashと同等のデータ型でkey: valueを使用します。

ハッシュを書き出す方法を変換するgemについては、現在のプロジェクトで行っている方法に固執します。

* key: valueを使用する場合、キーはシンボルになり、fooハッシュでそのキーに格納された値にアクセスする場合、foo[:key]のままになります。

1
Charles