如果我们在集合上有一个方法,该方法接受一个 block ,并在每个元素上执行另一个方法,我们可以使用&符号将其写得更短。例如:如果我们有一个整数数组,我们想删除奇数,我们可以这样做:
[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'}
我们如何使用与符号语法来编写它(如果可能的话)?
最佳答案
你不能,这不可能。
&
后跟一个符号是不接受任何参数的方法的快捷方式。
正如你所说,
.reject(&:odd?)
是一个快捷方式:
.reject {|x| x.odd?}
基本上,&:SYMBOL
始终是传递 block {|x| 的快捷方式x.SYMBOL}
之所以可行,是因为在符号上调用 #to_proc 方法会返回一个 lambda 表达式,它是一个单参数 lambda,它会调用与其参数上的符号同名的方法。
并且 &
将 lambda 转换为 block 参数——但除此之外,将在其操作数上调用 to_proc
,然后再将其转换为 block 参数。所以它在符号上调用 to_proc
,然后从符号中获取一个 lambda。然后将其作为 block 参数传递给您的方法。
当您需要一个主体超出单参数 block 的 block 时,无法使用该快捷方式,该单参数 block 仅调用以其参数上的符号命名的方法。
照原样写出来。 .reject {|x| 完全没有问题x.包括? 'a'}
,就这么写吧。
关于ruby - 为&符号 block 提供参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33086468/