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

前端之家收集整理的这篇文章主要介绍了在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))
原文链接:https://www.f2er.com/ruby/266126.html

猜你在找的Ruby相关文章