比较中将&符号与枚举器一起使用

时间:2018-08-13 18:37:57

标签: ruby

我有以下代码段引发错误:

w = %w[ant dog]
w.all?(&:length > 4)

它引发错误comparison of Symbol with 4 failed (ArgumentError)

我不确定为什么&:length是符号而不是数字。我尝试过:

w.all?((&:length) > 4)

但是这给了我一个语法错误。是否有办法使它正常工作或必须做:w.all? { |word| word.length > 4 }

3 个答案:

答案 0 :(得分:1)

您收到以下错误,因为解释器实际上执行了以下代码:

popasync(true).

并且不能将符号&:length > 4 与数字:length进行比较。

  

是否有办法使它正常工作或必须做:全部吗? {|单词| word.length> 4}

您可以执行以下操作:

4

但是下面的代码是最简单的方法:

w.map(&:length).all? { |n| n > 4 }

答案 1 :(得分:0)

  

有没有办法使这种方式w.all?(&:length > 4)起作用?

无法使其以这种方式工作,因为它将需要您重写Ruby的解释器。

  

还是我必须做:w.all? { |word| word.length > 4 }

是的,这是一种易于阅读但有效的方式来完成您所需的事情。

答案 2 :(得分:0)

对于发生的事情,我不得不四处寻找一个好的技术答案。 I found a thorough explanation here.该页面的最后一部分说明了在这种特殊情况下发生的情况(但您也应该阅读页面的顶部)。

来自Perl,我想象var total; for (let i = 0; i < cart.length; i++) { total += cart[i].price * cart[i].amount; } console.log(total); 的行为类似于&:length变量。这是不正确的。

正在发生的事情是,不是将参数传递给$_方法,而是将参数传递给all?方法(请注意括号而不是花括号)。在这里,我们将方法all?的符号作为参数传递给length。您将all?放在符号前面,以使其在&方法上调用to_proc方法(无论是哪种方法),以便它可以在内部调用length函数每个元素的length方法。