【问题标题】:What does Post.all.map(&:id) mean? [duplicate]Post.all.map(&:id) 是什么意思? [复制]
【发布时间】:2012-03-17 03:14:44
【问题描述】:

可能重复:
What does map(&:name) mean in Ruby?

Post.all.map(&:id) 

将返回

 => [1, 2, 3, 4, 5, 6, 7, ................] 

map(&:id) 是什么意思?尤其是&

【问题讨论】:

  • 感谢您以完全相同的形式关闭。这个问题有点难找。对不起。

标签: ruby-on-rails ruby activerecord


【解决方案1】:

& 符号用于表示应将以下参数视为赋予该方法的块。这意味着如果它还不是 Proc 对象,则将调用其to_proc 方法将其转换为一个。

因此,您的示例结果类似于

Post.all.map(&:id.to_proc)

相当于

Post.all.map { |x| x.id }

因此它遍历Post.all 返回的集合,并使用对每个项目调用的id 方法的结果构建一个数组。

这是有效的,因为Symbol#to_proc 创建了一个 Proc,它接受一个对象并调用带有符号名称的方法。主要是为了方便,省点打字。

【讨论】:

  • 这不是真的。 map(:id.to_proc) 将抛出 ArgumentError 因为 map 不接受任何参数。将 Proc 作为参数传递与提供块相同。 & 所做的是将 Proc 转换为块,如果操作数不是 Proc,则首先调用 to_proc,然后将结果转换为块。
  • @sepp2k:是的,我忘记了&
  • 你的第一句话也应该是“&x is the same as &x.to_proc”——除了定义是无限递归的。
  • @sepp2k:我已经删除了那部分。
【解决方案2】:

& 表示你正在传递一个块

Post.all 是方法 .map 的接收者,它的块正在被传递

Post.all.map { |item| # do something }

http://ruby-doc.org/core-1.9.3/Enumerable.html#method-i-map

它遍历数组并使用符号#to_proc 创建一个 lambda

http://ruby-doc.org/core-1.9.3/Symbol.html#method-i-to_proc

【讨论】:

    【解决方案3】:

    这将获取所有Post 对象并创建一个数组,其中每个对象都调用id 方法。

    换句话说,对于 ActiveRecord,这意味着您将获得一个具有 id 属性的数组,用于数据库中的所有 Post 实体。

    【讨论】:

      【解决方案4】:

      这是一个 Ruby 技巧,它依赖于 Ruby 进行一些动态类型转换。你可以找到Symbol#to_proc trick here的解释。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-09-12
        • 2015-01-22
        • 1970-01-01
        • 2020-10-27
        • 2015-07-15
        • 2018-07-17
        • 2012-08-13
        • 2011-12-23
        相关资源
        最近更新 更多