Как два аргумента могут быть переданы методу с сигнатурой с одним аргументом? - PullRequest
0 голосов
/ 17 сентября 2009
s = Proc.new {|x|x*2}

def one_arg(x)
  puts yield(x)
end

one_arg(5, &s)

Как one_arg узнает о &s?

Ответы [ 2 ]

3 голосов
/ 17 сентября 2009

Делая &s, вы говорите one_arg, что хотите, чтобы ваш Proc s был передан как блок (пожалуйста, исправьте меня, если я ошибаюсь). Эквивалентное письмо будет

one_arg(5) do |x|
  x *2
end

В последнее время у SO было несколько вопросов, которые касаются этого. Август Лиллеас довольно мило пишет о некоторых тонкостях всего этого безумия Руби.

3 голосов
/ 17 сентября 2009

Оператор & превращает Proc в блок, поэтому он становится методом с одним аргументом и блоком (который вызывается с yield). Если бы вы остановили & так, чтобы он напрямую проходил Proc, вы бы получили ошибку.

...