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


124

:key => "value"(hashrocket)とkey: "value"(Ruby 1.9)の表記に違いはありますか?

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

回答:


153

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

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、パーサーはこれらのキーにラベルパターンを使用します)。

:$inMongoDBのを使用しているとき、あなたはMongoDBのを使用する場合は、ハッシュのスタイルを混合なってしまいますので、スタイルのシンボルは、公平なビットを表示します。また、h[:k]ハッシュ全体(h = { ... })だけでなく、ハッシュ()の特定のキーを操作する場合でも、シンボルにはコロンファーストスタイルを使用する必要があります。また、ハッシュの外で使用するシンボルには、先頭のコロンのスタイルを使用する必要があります。私は一貫性を保つことを好むので、JavaScriptスタイルにまったく煩わされません。

JavaScriptスタイルの問題の一部はRuby 2.2で修正されています。次の例のように、有効なラベルではない記号がある場合は、引用符を使用できます。

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

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


h = { 'a.b': 'c' }Ruby 2.2.0の時点で合法です。bugs.ruby-lang.org/issues/4276を
Bセブン

@BSeven:おかげで、私は少し前に他の大きなハッシュロケットの回答を更新しましたが、これはありませんでした
muが短すぎる

なぜあなたは感じていますかh[:s] = 42の例では、この質問に関連しますか?私の意見では、JavaScriptスタイルとハッシュロケットスタイルはハッシュキーと値のペアの定義にのみ関連し、ハッシュ要素のキーへのアドレス指定には関係ありません。したがって、このh[s:] = 42例は誤解を招くようです。
Nic Nilov、

@NicNilovこれは、JavaScriptスタイルがシンボルに関するものであり、ハッシュキーとして許可されている表記法が混乱を招くように、コンテキストに依存しているため、これに関連しています。
muが短すぎる

同意できない。ハッシュスロットをシンボルでアドレス指定するときは、常にh[:s] = 42表記法を使用します。他のオプションはありません。キーと値のペアを定義するときに、{ key: value }JavaScriptスタイルまたは{ :key => value }ハッシュロケットスタイルのオプションを取得します。対処シナリオは、フォーカスされているものにはまだ関連していないようです。
Nic Nilov、

11

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


5

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


4

key: valueこの構文は、ルビーの古いバージョンでは動作しないことを念頭に置いてクマので、JSON形式の割り当ては、新しいRuby 1.9のハッシュ構文の一部です。また、キーはシンボルになります。これらの2つの制約に対処できる場合、新しいハッシュは古いハッシュと同じように機能します。それらを変換する理由(おそらくスタイル以外)はありません。


5
PS:それはJSONスタイルではなく、JavaScriptスタイルです。JSONでは、キーを引用符で囲む必要があります。
muが短すぎる

1

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

あなたがハッシュを書いた方法を変換する宝石に関しては、私はあなたが現在のプロジェクトのためにそれをしている方法に固執するでしょう。

* key: valueキーを使用する場合は記号になり、fooハッシュでそのキーに格納された値にアクセスする場合は引き続きですfoo[:key]


PerlとPHPの両方がを使用します=>。RubyはPerlに強く影響を受けているため、Perlから構文を借用したと思います:)
Daniel Serodio
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.