これが私の状況です。私は2つのアレイを持っています
@names = ["Tom", "Harry", "John"]
@emails = ["[email protected]", "[email protected]", "[email protected]"]
これら2つを@list
という配列/ハッシュに結合して、ビューで次のように繰り返すことができるようにします。
<% @list.each do |item| %>
<%= item.name %><br>
<%= item.email %><br>
<% end %>
この目標を達成する方法を理解するのに苦労しています。何かご意見は?
@names = ["Tom", "Harry", "John"]
@emails = ["[email protected]", "[email protected]", "[email protected]"]
@list = @names.Zip( @emails )
#=> [["Tom", "[email protected]"], ["Harry", "[email protected]"], ["John", "[email protected]"]]
@list.each do |name,email|
# When a block is passed an array you can automatically "destructure"
# the array parts into named variables. Yay for Ruby!
p "#{name} <#{email}>"
end
#=> "Tom <[email protected]>"
#=> "Harry <[email protected]>"
#=> "John <[email protected]>"
@urls = ["yahoo.com", "ebay.com", "google.com"]
# Zipping multiple arrays together
@names.Zip( @emails, @urls ).each do |name,email,url|
p "#{name} <#{email}> :: #{url}"
end
#=> "Tom <[email protected]> :: yahoo.com"
#=> "Harry <[email protected]> :: ebay.com"
#=> "John <[email protected]> :: google.com"
ただ違う:
[@names, @emails, @urls].transpose.each do |name, email, url|
# . . .
end
これは Array#Zip と似ていますが、この場合、短い行のパディングがゼロにならない点が異なります。何かが欠けている場合、例外が発生します。
Hash[*names.Zip(emails).flatten]
これにより、名前=> emailのハッシュが得られます。
これを試して
Hash[@names.Zip(@emails)]
2つの配列@ names = ["Tom"、 "Harry"、 "John"]があります
@emails = ["[email protected]"、 "[email protected]"、 "[email protected]"]
@ names.Zip(@emails)@ emailsを以下のようにインデックスに関連付けられた@namesにマージします[["Tom"、 "[email protected]"]、["Harry"、 "[email protected]"] 、["John"、 "[email protected]"]]
これで、Hash [@ names.Zip(@emails)]を使用してこの配列をハッシュに変換できます。
Zip
を使用して2つの配列を圧縮し、次にmap
を使用してname-email-pairsからItem
オブジェクトを作成できます。 Item
メソッドがハッシュを受け入れるinitialize
クラスがあるとすると、コードは次のようになります。
@list = @names.Zip(@emails).map do |name, email|
Item.new(:name => name, :email => email)
end