Ответ 1
Документация немного неясна:
отправить (символ [, args...]) → obj
Вызывает метод, идентифицированный символом, передавая ему любые указанные аргументы.
Но обратите внимание на любую указанную часть аргументов. Блок, который вы передаете методу, действительно является смешным типом неявного аргумента, так что вы можете делать такие вещи, как:
def m(&b)
@a.each(&b)
end
m { |e| puts e }
чтобы передать блок как экземпляр Proc. Однако вы также можете это сделать:
def m
yield
end
m { puts 'pancakes' }
поэтому блок является особым для списка аргументов, но блок все еще ведет себя как аргумент, даже если он иногда неявный.
Учитывая, что приведенный выше "блок - это своего рода аргумент", а также важность блоков в Ruby, было бы разумно, чтобы send
прошел через блок. Вы также можете попробовать, но вы должны осторожно относиться к случайному и недокументированному поведению с помощью подхода "попробуйте":
class C
def m
yield
end
end
o = C.new
o.send(:m) { puts 'pancakes' }
# "pancakes" comes out