为什么我不能直接打印reduce / inject的结果

时间:2018-05-03 14:48:47

标签: ruby mri

在红宝石翻译中发现了一个有趣的怪癖 - 至少在MRI 2.4.2中。

据我所知,以下每个代码段都应该打印' 123'。如果我尝试直接打印reduce的结果,我得到NoMethodError: undefined method '' for 1:Integer(或者数组包含的任何类型)但是如果我先保存结果然后打印它,它就可以正常工作..

所以,这段代码被破坏了:

puts [1,2,3].reduce('') do |memo, num|
  memo + num.to_s
end

这段代码有效:

temp = [1,2,3].reduce('') do |memo, num|
  memo + num.to_s
end
puts temp

这些应该完全相同,对吧?这应该作为错误提交吗?我只是缺少一些基本的东西吗?

我认为它至少应该显示试图调用哪种方法。如果没有方法名称,Google无法找到有关未定义方法的任何内容......

1 个答案:

答案 0 :(得分:1)

puts来电需要括号。这有效:

puts([1,2,3].reduce('') do |memo, num|
  memo + num.to_s
end)

通常你可以避免使用括号,但有时解析器会发现含糊不清的内容,只会引发错误,就像第一种情况一样。