2016-07-19 6 views
3

私はRuby Enumerableモジュールをよく知っています。私は私が正しくmapを使用していないんだけど、私はRubyのenumerablesのレッスンを教え、学生がmapアウトをテストしていたときに、この例に出くわした知っmap enumerableの戻り値が期待値を返さない理由

names = [ "Donald", "Daisy", "Daffy" ] 

new_empty_array = [] 

new_names_array = names.map do |name| 
    new_empty_array << name 
end 

puts new_names_array.inspect 
# prints [["Donald", "Daisy", "Daffy"], ["Donald", "Daisy", "Daffy"], ["Donald", "Daisy", "Daffy"]] 

:次のコードスニペットを取ります。シャベル(<<)演算子の戻り値は、要素が追加された後の配列です。代わりに結果ではありません:

ショベルオペレータのループ処理と最終戻り値は処理されているようですか?何がありますか?

+1

は 'first_names' names''ことになっていますか? – squiguy

答えて

5

mapの結果は、同じ配列new_empty_arrayへの参照からなる配列です。 3つの異なる配列を作成するのではなく、mapブロック内の同じ配列を変更しています。

あなたがする必要がある、あなたが期待している出力を取得するには:サイドノートとして

new_names_array = first_names.map do |name| 
    (new_empty_array << name).dup 
end 

、あなたは出力のために、上記のコードよりも明らかであるこのコードを、使用することができますあなたが望む:

(1..first_names.size).map do |num| 
    first_names.take(num) 
end 
#=> [["Donald"], ["Donald", "Daisy"], ["Donald", "Daisy", "Daffy"]] 
+0

私はこれをまっすぐにして、各反復の戻り値は 'new_empty_array'であり、 '.map'の最後の反復は3要素の配列を返すので、マップから返されるのは最後の状態3で' new_empty_array'ですtimes –

+0

@AndrewKim 'new_empty_array'は配列への参照であり、そのマップへの参照を返します。したがって、配列として3つの参照で終わります - すべての3つの参照は、同じ物理配列を指します。要素 –

0
new_names_array = first_names.map do |name| 
    name 
end 

["Donald", "Daisy", "Daffy"]を与えるだろう。

first_namesの各要素は、mapで作成された新しい配列に値を返しますが、代わりに各要素に対して新しい配列new_empty_arrayを返します。

このオブジェクトは<< 3回で、最後に3つの名前を持っているので、3×3つの要素:

[new_empty_array, new_empty_array, new_empty_array] = [["Donald", "Daisy", "Daffy"], ["Donald", "Daisy", "Daffy"], ["Donald", "Daisy", "Daffy"]] 
+0

@Tin Man、編集のためにもう一度、あなたは私のような非英語圏の人々を修正するには多くの時間を投資しなければならない – peter

+0

あなたは ' –

関連する問題