Когда я передаю лямбду в instance_eval
как блок, кажется, что передается дополнительный аргумент:
lamb = -> { puts 'hi' }
proc = Proc.new { puts 'hi' }
instance_eval(&lamb)
# >> ArgumentError: wrong number of arguments (given 1, expected 0)
# from (irb):5:in `block in irb_binding'
# from (irb):7:in `instance_eval'
instance_eval(&proc)
# => hi
instance_exec(&lamb)
# => hi
Почему это так?Обратите внимание, что этот вопрос НЕ о том, почему лямбда выдает ошибку.Это хорошо понято.Вопрос в том, ПОЧЕМУ instance_eval
отправляет self
получателя в качестве параметра.Это не нужно, и сбивает с толку.И AFAIK не задокументировано.
Это помогает, но не объясняет, ПОЧЕМУ ruby будет делать это таким образом.Весь смысл instance_eval
в том, чтобы установить self
для получателя;зачем путать вещи, также передавая self
в proc?