0

在 ruby​​ 解释器中发现了一个有趣的怪癖——至少在 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

这些应该完全一样,对吧?这应该作为错误提交吗?我只是在这里遗漏了一些基本的东西吗?

我认为它至少应该显示试图调用哪种方法。在谷歌中找不到任何关于没有方法名称的未定义方法...

4

1 回答 1

1

puts您需要在通话中使用括号。这有效:

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

通常您可以避免使用括号,但有时解析器会发现歧义并且只会引发错误,就像在您的第一种情况下一样。

于 2018-05-03T15:15:18.257 回答