ruby - 为&符号 block 提供参数

标签 ruby methods proc

如果我们在集合上有一个方法,该方法接受一个 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/

相关文章:

ruby - 允许 block 处理可变数量参数的干净方法是什么?

ruby - 链接到 YARD 中的 Ruby 核心类

ruby - xvfb 在带显示器的机器上,应用程序可以运行 'in the background?'

ruby - 为什么 while 修饰符与 block 的行为不同?

ruby - ruby 是否支持递归枚举器?

javascript - React onClick 方法只需单击 1 次即可执行 if 语句和 setState

java - 确定矩形面积的多种方法

java - 我应该如何将此对象添加到数组中...?

linux - 在 3.11 或更高版本的现有子目录下创建 Proc fs 目录和条目?

linux - 从文件写入过程标准