为什么我不能直接打印reduce/inject的结果
Why can't I print the result of reduce/inject directly
在 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
这些应该完全一样,对吧?这应该作为错误提交吗?我只是错过了一些基本的东西吗?
我认为它至少应该显示正在尝试调用哪个方法。在 google 中找不到关于没有方法名称的未定义方法的任何信息...
您需要在 puts
调用中加上括号。这有效:
puts([1,2,3].reduce('') do |memo, num|
memo + num.to_s
end)
通常您可以避免括号,但有时解析器会发现歧义并引发错误,就像您的第一种情况。
在 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
这些应该完全一样,对吧?这应该作为错误提交吗?我只是错过了一些基本的东西吗?
我认为它至少应该显示正在尝试调用哪个方法。在 google 中找不到关于没有方法名称的未定义方法的任何信息...
您需要在 puts
调用中加上括号。这有效:
puts([1,2,3].reduce('') do |memo, num|
memo + num.to_s
end)
通常您可以避免括号,但有时解析器会发现歧义并引发错误,就像您的第一种情况。