Я пытаюсь запустить этот код. Я пытаюсь передать аргументы во внутреннюю процедуру, но мой код из-за этого не запускается. Что я делаю неправильно?
def log (descriptionOfProc,proc)
puts "I have started proC#{descriptionOfProc}"
puts "#{descriptionOfProc} is finished, returning #{proc.call}"
end
inner=Proc.new do |x,y|
x+y
end
middle=Proc.new do |x|
log("inner", inner[1, 2])
"check2"
end
outer=Proc.new do |x|
log("middle", middle)
"check3"
end
puts log("outer", outer)

Когда вы вызываете inner[1,2] внутри процедуры middle, вы фактически выполняете функцию, которая возвращает значение 3, тогда аргументом для log будет "inner", 3, а поскольку 3 не отвечает на call, ваш скрипт завершится ошибкой.
Если вы хотите исправить свой скрипт, ваш средний процесс должен выглядеть примерно так
middle=Proc.new do |x|
log("inner", -> { inner[1, 2] })
"check2"
end
Причина, по которой ваш код не работал, заключалась в том, что вы выполняли функцию inner с []. Выполнить блок в рубине можно по-разному .call, .yield, .(), []. Как видите, вы передали результат inner, а не сам процесс. Обернув вызов inner[1,2] внутри другого блока, который будет выполнен позже внутри log путем выполнения proc.call, вы задержите выполнение внутреннего.
Благодарность! почему он не выполняет функцию при записи между -> {}, но выполняет ее, если я опускаю -> {}
@SimpleLime технически это lambda, который представляет собой особый вид Proc. lambda действуют больше как анонимный метод, чем традиционный Proc, созданный с помощью Proc.new.
большое спасибо! это именно то, что мне нужно, и мой код работает. Вопрос, как называется эта нотация и как я могу узнать о ней больше? Что делает -> {}?