在Ruby中传递&符号与冒号(符号)之间的区别

时间:2014-08-28 14:32:07

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

在我的代码中,我有:

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(&: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&gt; ~2.0.0,传入&符号是可选的,等同于传递符号。

1 个答案:

答案 0 :(得分:7)

  

我的印象是对于Ruby&gt; ~2.0.0,传入&符号是可选的,等同于传递符号。

不,不是。

pluck(&:id)

的简写
pluck { |u| u.id }

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

pluck { }

或只是

pluck

返回所有列值的数组。