Разница в том, что a.instance_eval b передает b в качестве обычного аргумента instance_eval, тогда как a.instance_eval & b передает его как блок,Это две разные вещи.
Рассмотрим вызов этого метода:
obj.foo (bar) do | x |stuff (x) end
, который вызывает метод foo с одним регулярным аргументом ( bar ) и одним аргументом блока ( do | x |материал (х) конец ).В определении метода они различаются префиксом & к параметру блока:
def foo (arg, & block)
...
end
И если вы хотите передать переменное выражение вместо литерального блока, это также достигается с помощью префикса & к выражению (что должно привести кProc).
Если вы передаете аргумент без & , он идет в слот arg вместо слота block .Неважно, что аргумент является экземпляром Proc.Синтаксис определяет, как он передается и обрабатывается методом.