为&符号

时间:2015-10-12 16:58:56

标签: ruby methods proc

如果我们在一个集合上有一个方法,该方法在每个元素上执行另一个方法,那么我们可以使用&符号将它写得更短。例如:如果我们有一个整数数组,并且我们想要删除奇数,我们可以这样做:

[1,2,3,4,5,6,7,8].reject {|x| x.odd?}

使用&符号,我们可以这样写:

[1,2,3,4,5,6,7,8].reject(&:odd?)

假设我们有一个字符串数组,我们想删除包含'a'的元素。我们可以写这样的解决方案:

['abc','cba','cbc','cdc','dca','cad','dc','cc].reject {|x| x.include? 'a'}

我们如何使用&符号语法编写它(如果可能的话)?

1 个答案:

答案 0 :(得分:4)

你不能,这是不可能的。

&后跟一个符号是一个不带任何参数的方法的快捷方式。

正如你所说,

.reject(&:odd?)

是:

的快捷方式
 .reject {|x| x.odd?}

基本上,&:SYMBOL始终是传递块{|x| x.SYMBOL}

的快捷方式

这样做的原因是因为在符号上调用#to_proc方法会返回一个lambda表达式,该表达式是一个单参数lambda,它调用与其上的符号同名的方法。

并且&从lambda转换为块参数 - 但除此之外,在将其转换为块参数之前,将在其上调用to_proc操作数。所以它在符号上调用to_proc,然后从符号中获取lambda。然后将此作为块参数传递给您的方法。

当你需要一个超出单参数块的块时,无法使用该快捷方式,该块只调用以其上的符号命名的方法的参数。

就像你一样写出来。 .reject {|x| x.include? 'a'}没有任何错误,只需写下来。