如果我们在一个集合上有一个方法,该方法在每个元素上执行另一个方法,那么我们可以使用&符号将它写得更短。例如:如果我们有一个整数数组,并且我们想要删除奇数,我们可以这样做:
[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'}
我们如何使用&符号语法编写它(如果可能的话)?
答案 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'}
没有任何错误,只需写下来。