44

这是我的数组:

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

我想将to_s方法​​应用于我的所有数组元素以获取array = ['one','two','three'].

我该怎么做(将可枚举的每个元素转换为其他元素)?

4

4 回答 4

79

这将起作用:

array.map!(&:to_s)
于 2011-06-27T18:01:33.723 回答
19

您可以分别使用mapor map!,第一个将返回一个新列表,第二个将就地修改列表:

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

>> array.map{ |x| x.to_s }
=> ["one", "two", "three"]
于 2011-06-27T18:01:41.923 回答
16

值得注意的是,如果您有一个对象数组,您想单独传递给具有不同调用者的方法,如下所示:

# 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.

需要注意的是,与 with 一样Symbol#to_proc,您不能将参数传递给辅助方法。

于 2011-07-27T15:51:00.503 回答
8
  • array.map!(&:to_s)将原始数组修改为['one','two','three']
  • array.map(&:to_s)返回数组['one','two','three']
于 2011-06-27T18:04:36.143 回答