【问题标题】:Difference between passing ampersand colon vs just colon (a symbol) in Ruby在 Ruby 中传递 & 冒号与仅冒号(一个符号)之间的区别
【发布时间】:2014-08-28 14:32:07
【问题描述】:

在我的代码中:

class User < ActiveRecord::Base
  ...
    scope :matching, -> (column=nil, value=nil) { where("#{column} = ?", value) }
  ...
end

假设一个有效的public_id: a113f534(不要与:id混淆),当我这样做时:

User.matching("pubid", "a113f534").pluck(:id)

返回:

[1]

如果我这样做:

User.matching("pubid", "a113f534").pluck(&amp;:id)

返回:

[[1, "emaildata@inmydb.com", "$blahsomehash", "moreRandomDBdata", nil, Wed, 27 Aug 2014 18:55:33 UTC +00:00, Wed, 27 Aug 2014 21:22:17 UTC +00:00]]

为什么使用 & 冒号(我知道在符号上调用 to_proc)会返回一个包含我的 id 以及更多数据库列数据的数组,而不是当我只传入符号时,它返回我想要的(只是id)?

我的印象是,对于 Ruby > ~2.0.0,传入 & 符号是可选的,相当于只传入符号。

【问题讨论】:

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord ruby-on-rails-4


【解决方案1】:

我的印象是,对于 Ruby > ~2.0.0,传入 & 符号是可选的,相当于只传入符号。

不,不是。

pluck(&:id)

是的简写

pluck { |u| u.id }

即你正在通过一个街区。 pluck 然而忽略了这个块,所以上面的等价于

pluck { }

或者只是

pluck

它返回一个包含所有列值的数组。

【讨论】:

  • 感谢您的解释!但有一件事 - 如果 & 符号不再是可选的,为什么像 arr.inject(:+) 这样的东西会产生与 arr.inject(&amp;:+) 相同的结果?
  • @DannyY 看看method signatures of #inject - 他们可以只接受一个符号(如:+)或一个块(如&amp;:+)。所以并不是 & 是可选的,你可以随便使用一个。
猜你喜欢
  • 1970-01-01
  • 2016-11-04
  • 1970-01-01
  • 2014-08-30
  • 1970-01-01
  • 2021-10-21
  • 1970-01-01
  • 2019-09-14
  • 2012-09-25
相关资源
最近更新 更多