前田です。 In message "[ruby-list:5398] 配列への追加について" 西田明良 <a-nisida / post.co.jp> wrote: |下の様にイテレータの中で 簡単なテキスト処理をした結果を連想配列にしたも |のを、array に << で追加したいのですが、何故か array の要素が 全部最後 |に追加したものになってしまいます。つまり p array の結果が、 | | [{"c"=>"3", "a"=>"1", "b"=>"2"}, {"c"=>"7", "a"=>"9", "b"=>"8"}] | |と、なってほしいのですが、 | | [{"c"=>"7", "a"=>"9", "b"=>"8"}, {"c"=>"7", "a"=>"9", "b"=>"8"}] | |となってしまうのですが、いったい どこが、いけないのでしょうか? eachのイテレータブロックが2回目に評価される時,hash.clearした 時点でarrayの内容も [{"c"=>"3", "a"=>"1", "b"=>"2"}] から [{}] になってしまいます。 その後,hash[name]=valueで, [{"c"=>"7", "a"=>"9", "b"=>"8"}] となります。 これはarrayの第1要素とhashが同じオブジェクトを指しているからです。 data=["a=0;b=2;c=3","a=9;b=8;c=7"] array=[] data.each do |x| hash = {} tmp=x.split(';') tmp.each do |y| name , value = y.split('=') hash[name]=value end array << hash end p array のようにhashをイテレータブロックのローカル変数にすれば解決します。 # tmpもイテレータブロックの外で初期化する必要はありません。 -- 前田 修吾