【发布时间】:2011-02-15 07:24:02
【问题描述】:
以下问题与问题“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 怎么办?
【问题讨论】:
-
inject实际上是一个实例方法。 -
啊,没错,调用来触摸实例的值/属性的方法应该是实例方法。
-
谢谢马修,有问题已更正。
-
我不明白你为什么要写这么一个巨大的哲学问题,而真正的问题只是一个优先级问题
标签: ruby syntax function methods