Ruby嵌套数组遍历代码运行结果与预期不符问题咨询
Ruby代码执行结果与预期不符的问题
问题代码
test_scores = [ [97, 76, 79, 93], [79, 84, 76, 79], [88, 67, 64, 76], [94, 55, 67, 81] ] puts test_scores.any? do |scores| scores.all? { |score| score > 80 } end
问题描述
在Replit平台及本地WSL环境中运行上述Ruby代码时,输出结果为true,但根据The Odin Project的官方解释,预期输出应为false。The Odin Project中提到:
这看起来非常直观,返回false,因为没有任何一个嵌套数组中的分数全部超过80分
问题原因
这是Ruby的块绑定优先级导致的问题:any?方法搭配后续的do...end块时,优先级低于方法调用后的括号逻辑,实际代码会被解析为:
puts(test_scores.any?) do |scores| scores.all? { |score| score > 80 } end
也就是说,test_scores.any?会先执行(只要数组非空就返回true),puts直接输出这个true,后面的do...end块实际绑定给了puts方法,而非any?方法。
解决方法
有两种方式可以修正优先级问题:
- 使用大括号
{}替代do...end定义any?的块,明确绑定关系:puts test_scores.any? { |scores| scores.all? { |score| score > 80 } } - 给
any?的块加上括号,强制指定绑定对象:puts(test_scores.any? do |scores| scores.all? { |score| score > 80 } end)
修正后运行代码,输出结果会符合预期的false。
内容的提问来源于stack exchange,提问作者Md Arafat Hossain
相关产品推荐
相关产品推荐

