以下问题与问题“Ruby Print Inject Do Syntax”有关。我的问题是,我们能坚持使用
这是有效的:
在上述两种情况下,我们可以直接说
最终,以下版本可以正常工作:
do
和end
并使其与puts
或p
一起使用吗?这是有效的:
a = [1,2,3,4]
b = a.inject do |sum, x|
sum + x
end
puts b # prints out 10
那么,可以这样说吗,inject
是Array对象的一个实例方法,这个实例方法接受一段代码块,然后返回一个数字。如果是这样的话,那么它与调用函数或方法并获取返回值没有任何区别:
b = foo(3)
puts b
或者
b = circle.getRadius()
puts b
在上述两种情况下,我们可以直接说
puts foo(3)
puts circle.getRadius()
因此,不能通过以下两种方式直接使其正常工作:
a = [1,2,3,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,2,3,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,2,3,4]
puts a.inject { |sum, x|
sum + x
}
但是为什么在先前的示例中使用( )
进行方法调用的分组不起作用呢?如果程序员坚持使用do
和end
,能否使其起作用?