@H_404_1@以下问题与“
Ruby Print Inject Do Syntax”问题有关.我的问题是,我们可以坚持使用do和end,并使其与put或p一起工作吗?
这样做:
- a = [1,2,3,4]
- b = a.inject do |sum,x|
- sum + x
- end
- puts b # prints out 10
所以说,注意是Array对象的一个实例方法,而这个实例方法接受一个代码块,然后返回一个数字.如果是这样,那么调用函数或方法并返回一个返回值是没有什么不同的:
- b = foo(3)
- puts b
要么
- b = circle.getRadius()
- puts b
在上述两种情况下,我们可以直接说
- puts foo(3)
- puts circle.getRadius()
所以没有办法通过使用以下两种方法直接使其工作:
- a = [1,4]
- puts a.inject do |sum,x|
- sum + x
- end
但它给了
- ch01q2.rb:7:in `inject': no block given (LocalJumpError)
- from ch01q2.rb:4:in `each'
- from ch01q2.rb:4:in `inject'
- from ch01q2.rb:4
- a = [1,4]
- puts (a.inject do |sum,x|
- sum + x
- end)
这给出:
最后,以下版本的作品:
- a = [1,4]
- puts a.inject { |sum,x|
- sum + x
- }
解决方法
从(非官方)
ruby grammar,我们看到put(…)中的(…)的内容必须是CALL_ARGS,它不直接减少到STMT.但是,它们可以减少到'(‘COMPSTMT’)’.通过添加一组额外的括号,可以使用do … end.
- a = [1,4]
- puts ((a.inject do |sum,x|
- sum + x
- end))