【问题标题】:Apply method to each elements in array/enumerable将方法应用于数组/可枚举中的每个元素
【发布时间】:2011-09-23 17:25:56
【问题描述】:

这是我的数组:

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

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

我怎样才能做到这一点(将可枚举的每个元素转换为其他元素)?

【问题讨论】:

标签: ruby arrays enumerable


【解决方案1】:

这将起作用:

array.map!(&:to_s)

【讨论】:

  • 它肯定在 Ruby 1.8.7 中工作。我在所有项目中都使用它。
  • Symbol#to_proc 在 1.8.6 中不可用,但在 1.8.7 中可用:apidock.com/ruby/Symbol/to_proc。我也从个人经验中知道这一点,因为我不使用 Rails 或其库。
  • 我认为值得注意的是 collectcollect!mapmap! 的别名。
  • ! 是干什么用的?
  • @user1492534 ! 是方法名的一部分,没有魔法,但它用来告诉你它将更改的值定义为self,而不是仅仅返回更改的值:stackoverflow.com/a/612196/540447
【解决方案2】:

你可以分别使用map或者map!,第一个会返回一个新的列表,第二个会就地修改列表:

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

>> array.map{ |x| x.to_s }
=> ["one", "two", "three"]

【讨论】:

  • 感谢您快速详细的回答!
【解决方案3】:

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

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

您可以使用method 方法结合块扩展行为来简化:

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

如果您不熟悉,method 所做的是将与传递给它的符号关联的方法封装在 Proc 中并返回它。 & 符号将此 Proc 扩展为一个块,该块很好地传递给 mapmap 的返回是一个数组,我们可能希望将其格式化得更好一些,因此是 join

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

【讨论】:

    【解决方案4】:
    • array.map!(&amp;:to_s) 将原始数组修改为['one','two','three']
    • array.map(&amp;:to_s) 返回数组 ['one','two','three']

    【讨论】:

    • @sawa:实际上,这不是真的。 Ruby-On-Rails 实际上是一种编程语言,关于它的问题比关于 Ruby 的要多。但就像 Perl、CLU 和 SmallTalk 一样,Ruby 已将其最好的部分整合到其语言中。 ;) xkcd.com/386
    • @Andrew 好的。谢谢。在你发表评论之前,我删除了我的评论。
    • 对于那些想知道我在幽默地回答什么的人,@sawa 基本上是问回答者是否知道 Ruby 是一门语言,Rails 是一个在 Ruby 上运行的框架,因为@sawa 认为 Symbol# to_proc 在 1.8.7 中是 Rails 独有的。
    猜你喜欢
    • 2013-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    • 2017-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多