2016-04-30 12 views
0

私はRubyのに非常に新しいですし、私は以下のハッシュの作成を理解しようとしています:理解ハッシュ作成

hash = Hash.new { |hash, key| hash[key] = [] } 

私はそれを解釈できますか?構文(ブロックの内容)はまだわかりません。

答えて

2

Hash.new - あなたは

{ |hash, key| hash[key] = [] }ハッシュのコンストラクタを呼び出している - あなたはコンストラクタにこのブロックを渡しています。このブロックはハッシュに対して:未知のキーに遭遇したときに、そのキーをキーとし、新たに割り当てられた空の配列を値として新しいキー/値ペアを作成します。

hash = - この変数に新しいハッシュを割り当てます。しかし、変数名としてhashを使用しないでください!これはすでに、クラスサブクラスがObjectのすべてのオブジェクトのメソッドの名前です。

もシンプルな記法があります:

Hash.new([]) 

けど)、存在しないキーへのすべての参照は、同じ配列を共有するので、それは、めったにあなたが望むものではありません、そしてb)それは、作成にはなりません。任意のキー/値のペア:|hash, key|の構文について

2.3.0 :001 > h = Hash.new([]) 
=> {} 
2.3.0 :002 > h[:a] << 1 
=> [1] 
2.3.0 :003 > h[:b] 
=> [1] 
2.3.0 :004 > h.keys.include? :a 
=> false 
2.3.0 :005 > h.keys 
=> [] 

、そのフラグメントは、例えばメソッドの括弧で囲まれた引数リストと全く同じ目的を果たします以下のコードの(hash, key)

def f(hash, key) 
    hash[key] = [] 
end 
+1

'Hash.new([])'はキーに値を割り当てません(キーが見つからない場合)。同じ**デフォルト**配列を返すだけです。 'h = Hash.new([]); h [:a]; h#=> {} '。 – sawa

+1

@sawaその説明をありがとうございました。私はそれを組み込むために私の答えを変更しました。 –

関連する問題