Это немного странно, но если вы хотите пропустить пустой блок (или если вы все равно его пропускаете), вы можете получить привязку из блока, затем вызвать eval
и передать привязку:
def foo(symbol, &block)
binding = block.send(:binding)
eval(symbol.to_s, binding)
end
var = 3
puts foo(:var) {}
Это напечатает 3.
В качестве альтернативы, ActiveSupport, очевидно, имеет нечто, называемое Binding.of_caller, которое вы можете использовать, чтобы вам не приходилось пропускать блок, но я не знаю, насколько хорошо он работает.
Другая альтернатива - вызвать foo и передать привязку в:
def foo(binding, symbol)
eval(symbol.to_s, binding)
end
binding = self.send(:binding)
var = 3
puts foo(binding, :var)