前田です。

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もイテレータブロックの外で初期化する必要はありません。

-- 
前田 修吾