在Ruby中,为什么在使用“do”和“end”时,方法调用不能被视为单位?

以下问题与“ 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

方法调用using()进行分组不起作用:

a = [1,4]

puts (a.inject do |sum,x| 
        sum + x   
      end)

这给出:

ch01q3.rb:4: Syntax error,unexpected kDO_BLOCK,expecting ')'
puts (a.inject do |sum,x|
                 ^
ch01q3.rb:4: Syntax error,unexpected '|',expecting '='
puts (a.inject do |sum,x|
                          ^
ch01q3.rb:6: Syntax error,unexpected kEND,expecting $end
      end)
         ^

最后,以下版本的作品:

a = [1,4]

puts a.inject { |sum,x|
    sum + x
}

但是为什么方法调用using()的分组在前面的例子中有效?如果一个程序员坚持他使用和结束,该怎么办?

解决方法

从(非官方) ruby grammar,我们看到put(…)中的(…)的内容必须是CALL_ARGS,它不直接减少到STMT.但是,它们可以减少到'(‘COMPSTMT’)’.通过添加一组额外的括号,可以使用do … end.
a = [1,4]

puts ((a.inject do |sum,x| 
         sum + x   
       end))

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...