Ruby 为什么我不能直接打印reduce/inject的结果
在ruby解释器中发现了一个有趣的怪癖——至少在MRI 2.4.2中是这样 据我所知,下面的每个代码段都应该打印“123”。如果我试图直接打印reduce的结果,我会得到1:Integer或数组包含的任何类型的NoMethodError:undefined方法,但是如果我先保存结果,然后打印,它就可以正常工作 所以,这个代码被破坏了:Ruby 为什么我不能直接打印reduce/inject的结果,ruby,mri,Ruby,Mri,在ruby解释器中发现了一个有趣的怪癖——至少在MRI 2.4.2中是这样 据我所知,下面的每个代码段都应该打印“123”。如果我试图直接打印reduce的结果,我会得到1:Integer或数组包含的任何类型的NoMethodError:undefined方法,但是如果我先保存结果,然后打印,它就可以正常工作 所以,这个代码被破坏了: puts [1,2,3].reduce('') do |memo, num| memo + num.to_s end 这一准则适用于: temp = [1,
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
这些应该完全一样,对吗?这应该作为bug归档吗?我是不是错过了一些基本的东西
我认为它至少应该显示要调用哪个方法。在google中找不到关于没有方法名称的未定义方法的任何信息…puts调用需要括号。这项工作:
puts([1,2,3].reduce('') do |memo, num|
memo + num.to_s
end)
通常,您可以避免使用括号,但有时解析器会发现歧义,只会引发错误,就像在第一种情况下一样。第二个代码段有效吗?我得到零分,不确定这是否是你所期望的。是的。temp被成功设置为“123”,并正常打印,同时返回nil,这就是您看到的吗?Clarity的最新问题这已经被问了很多次了。你是把方块传给puts,而不是注射。谢谢!我想我可以看出,如果puts接受一个块,而reduce在这种情况下不需要一个块,那么它将是多么的模糊。需要明确的是,一般来说,如果函数调用中应该有块,那么总是需要paren?@kennycoc我想是的。