Следующий вопрос относится к вопросу " 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()
Итак, нет способа заставить его работать напрямую, используя следующие 2 способа:
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
, можно ли заставить его работать?