将参数提供给&块

Dmi*_*tri 3 ruby methods proc

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

[1,2,3,4,5,6,7,8].reject {|x| x.odd?}
Run Code Online (Sandbox Code Playgroud)

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

[1,2,3,4,5,6,7,8].reject(&:odd?)
Run Code Online (Sandbox Code Playgroud)

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

['abc','cba','cbc','cdc','dca','cad','dc','cc].reject {|x| x.include? 'a'}
Run Code Online (Sandbox Code Playgroud)

我们如何使用与号语法编写此代码(如果可能)?

jro*_*ind 5

您不能,不可能。

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

如你所说,

.reject(&:odd?)
Run Code Online (Sandbox Code Playgroud)

是以下操作的快捷方式:

 .reject {|x| x.odd?}
Run Code Online (Sandbox Code Playgroud)

基本上,&:SYMBOL始终是传递块的快捷方式{|x| x.SYMBOL}

起作用的原因是因为在符号上调用#to_proc方法会返回一个lambda表达式,该表达式是一个单参数的lambda,它将使用与参数上的符号相同的名称来调用该方法。

&将来自lambda来块的说法-但除此之外,将调用to_proc它的操作将其转换为一个块参数之前。因此它调用to_proc该符号,然后从该符号获取一个lambda。然后将此作为块参数传递给您的方法。

当您需要一个块的主体超出一个自变量块的块时,无法使用该快捷方式,该块仅调用以其符号上的符号命名的方法。

像您一样将其写出来。完全没错.reject {|x| x.include? 'a'},只需写下来。