Аргументы в пользу процедуры в рубине

Я пытаюсь запустить этот код. Я пытаюсь передать аргументы во внутреннюю процедуру, но мой код из-за этого не запускается. Что я делаю неправильно?

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)
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
0
0
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Когда вы вызываете 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, вы задержите выполнение внутреннего.

большое спасибо! это именно то, что мне нужно, и мой код работает. Вопрос, как называется эта нотация и как я могу узнать о ней больше? Что делает -> {}?

user9489003 14.03.2018 04:33

Благодарность! почему он не выполняет функцию при записи между -> {}, но выполняет ее, если я опускаю -> {}

user9489003 14.03.2018 05:09

@SimpleLime технически это lambda, который представляет собой особый вид Proc. lambda действуют больше как анонимный метод, чем традиционный Proc, созданный с помощью Proc.new.

engineersmnky 14.03.2018 16:24

Другие вопросы по теме