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

Dan*_*y Y 2 ruby activerecord ruby-on-rails ruby-on-rails-3 ruby-on-rails-4

在我的代码中,我有:

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

假设有效public_id: a113f534(不要与a混淆: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]]
Run Code Online (Sandbox Code Playgroud)

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

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

Ste*_*fan 7

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

不,这不对.

pluck(&:id)
Run Code Online (Sandbox Code Playgroud)

是速记

pluck { |u| u.id }
Run Code Online (Sandbox Code Playgroud)

即你正在通过一个街区.pluck但是忽略了块,所以上面相当于

pluck { }
Run Code Online (Sandbox Code Playgroud)

要不就

pluck
Run Code Online (Sandbox Code Playgroud)

它返回所有列值的数组.

  • @DannyY查看[#inject]的方法签名(http://ruby-doc.org/core-2.1.2/Enumerable.html#method-i-inject) - 他们只能接受一个符号(如`: +`),或块(如`&:+`).所以它不是&可选的,你可以使用其中任何一个. (3认同)