2012-02-27 58 views

回答

73

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

因此,在一些你的榜样结果像

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

这又相当于

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

所以它遍历由Post.all返回的集合,并构建了结果数组每个项目都调用id方法。

这是可行的,因为Symbol#to_proc创建了一个Proc,它接受一个对象并用该对象的名称调用该方法。它主要用于方便,以节省一些打字。

+5

这是不正确的。 map(:id.to_proc)会抛出一个ArgumentError,因为map不接受任何参数。将Proc作为参数传递给**不是和提供块相同。 '&'做的是将Proc变成块,如果操作数不是Proc,它首先调用to_proc,然后将结果变成块。 – sepp2k 2012-02-27 16:43:57

+0

@ sepp2k:是的,我忘记了一个'&'。 – 2012-02-27 16:44:43

+0

你的第一句话还应该读一些像''&x'与'&x.to_proc''一样的东西 - 除了定义是无限递归的。 – sepp2k 2012-02-27 16:46:53

1

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

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