web-dev-qa-db-ja.com

配列/列挙型の各要素にメソッドを適用します

これは私の配列です:

array = [:one,:two,:three]

適用したいto_sメソッドを使用してすべての配列要素にarray = ['one','two','three']

どうすればこれを行うことができますか(列挙型の各要素を別のものに変換する)?

39

これは動作します:

array.map!(&:to_s)
65
sawa

オブジェクトの配列がある場合、次のように、異なる呼び出し元のメソッドに個別に渡したいことに注意してください。

# erb
<% strings = %w{ cat dog mouse rabbit } %>
<% strings.each do |string| %>
  <%= t string %>
<% end %>

methodメソッドをブロック展開動作と組み合わせて使用​​すると、次のことが簡単になります。

<%= strings.map(&method(:t)).join(' ') %>

慣れていない場合、methodは、Procで渡されたシンボルに関連付けられたメソッドをカプセル化し、それを返します。アンパサンドはこのProcをブロックに展開し、mapにうまく渡されます。 mapの戻り値は配列であり、おそらくもう少しうまくフォーマットしたいので、joinにします。

警告は、Symbol#to_proc、引数をヘルパーメソッドに渡すことはできません。

16
coreyward

map または map! それぞれ、最初のリストは新しいリストを返し、2番目のリストはリストをその場で変更します。

>> array = [:one,:two,:three]
=> [:one, :two, :three]

>> array.map{ |x| x.to_s }
=> ["one", "two", "three"]
16
miku
  • array.map!(&:to_s)は元の配列を_['one','two','three']_に変更します
  • array.map(&:to_s)は、配列_['one','two','three']_を返します。
7