我有以下代码段引发错误:
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 }
。
答案 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
方法。