Поскольку интерфейсы не вынуждают Вас в некоторую иерархию наследования.
Что это за переменная obj
в вашем примере? Если это локальная переменная области, в которой вызывается foo, к ней нельзя получить доступ изнутри foo, если вы не передадите текущую привязку в качестве второго параметра.
Если вы хотите получить доступ к переменной экземпляра @obj
, это просто:
def foo(bar)
instance_variable_get("@#{bar}").length
end
@obj = "lala"
foo("obj") #=> 4
Вы имеете в виду переменную или метод доступа? Sepp2k дал имя переменной экземпляра; для использования аксессуара
def foo(bar)
self.send(bar).some_method_call
end
Вы почти наверняка не сможете. У этого определения не будет доступа к локальным переменным вызывающей области. Если вы хотите более подробно объяснить, что вы пытаетесь сделать, мы могли бы предложить полезную альтернативу.
Вы можете использовать eval
def foo(bar)
eval(bar.to_s).some_method_call
end
Это немного странно, но если вы хотите передать пустой блок (или если вы все равно пропускаете его ), вы можете получить привязку из блока, затем вызвать 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)