1

配列をループするときに配列が更新される方法について混乱しています。これは、動作を示す作成された例です。

people = [{"name"=>"Edward", "age" =>"43", "height"=>"tallish"},
          {"name"=>"Ralph", "age" =>"40", "height"=>"medium heigth"},
          {"name"=>"George", "age" =>"35", "height"=>"very tall"},
          {"name"=>"Mark", "age" =>"25", "height"=>"short"}]
numbers = ["1","3","26"]
new_array = []

numbers.each do |number|
    people.each do |person|
        person["name"] = person["name"] +" "+ number
        new_array << person
    end
end

そのnew_arrayの終わりに

[{"name"=>"Edward 1 3 26", "age"=>"43", "height"=>"tallish"},
{"name"=>"Ralph 1 3 26", "age"=>"40", "height"=>"medium heigth"},
{"name"=>"George 1 3 26", "age"=>"35", "height"=>"very tall"},
{"name"=>"Mark 1 3 26", "age"=>"25", "height"=>"short"},
{"name"=>"Edward 1 3 26", "age"=>"43", "height"=>"tallish"},
{"name"=>"Ralph 1 3 26", "age"=>"40", "height"=>"medium heigth"},
{"name"=>"George 1 3 26", "age"=>"35", "height"=>"very tall"},
{"name"=>"Mark 1 3 26", "age"=>"25", "height"=>"short"},
{"name"=>"Edward 1 3 26", "age"=>"43", "height"=>"tallish"},
{"name"=>"Ralph 1 3 26", "age"=>"40", "height"=>"medium heigth"},
{"name"=>"George 1 3 26", "age"=>"35", "height"=>"very tall"},
{"name"=>"Mark 1 3 26", "age"=>"25", "height"=>"short"}]

一人一人が3回登場しますが、私はそれを期待して欲しかったのです。しかし、彼らの名前は毎回同じです。名前が"Edward 1"初めて、"Edward 1 3"そして最後になると思っていました"Edward 1 3 26"

何が起きてる?ループは、3つすべて同じではなく、それぞれの個別のハッシュをnew_arrayに追加すると思いました。

4

2 に答える 2

1

people.eachはの各エントリへの参照を提供しているpeopleためperson["name"] =...、元の配列を変更することになります。

これを試して:

numbers.each do |number|
    people.each do |person|
        new_person = person.dup
        new_person["name"] << " " + number
        new_array << new_person
    end
end
于 2012-04-23T12:56:43.547 に答える
0

コードを少し変換して、プロセスを確認できます

numbers.each do |number|
    people.each do |person|
        person["name"] = person["name"] +" "+ number
        new_array << person
        puts person["name"]
    end
end

次の結果が得られます。

Edward 1
...
Edward 1 3
...
Edward 1 3 26
...

ご覧のとおり、アルゴリズムはほぼ期待どおりに機能します。ただし、person["name"]1つのオブジェクト(文字列)のみを参照しているため、最終結果には最後の文字列が含まれますEdward 1 3 26

編集:あなたが望むものを手に入れるには、毎回新しいオブジェクトを作成する必要があります

numbers.each do |number|
  people.each do |person|
    person["name"] = person["name"] +" "+ number
    new_array << person.dup
  end
end

この式はpeople変数を再初期化することを忘れないでください

person["name"] = person["name"] +" "+ number

people変数を変更します。

于 2012-04-23T13:01:10.823 に答える