以下问题与“
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)
这给出:
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 }
解决方法
从(非官方)
ruby grammar,我们看到put(…)中的(…)的内容必须是CALL_ARGS,它不直接减少到STMT.但是,它们可以减少到'(‘COMPSTMT’)’.通过添加一组额外的括号,可以使用do … end.
a = [1,4] puts ((a.inject do |sum,x| sum + x end))