Ruby - преобразуйте от символа до переменной

Поскольку интерфейсы не вынуждают Вас в некоторую иерархию наследования.

11
задан Adobe 27 March 2016 в 11:39
поделиться

5 ответов

Что это за переменная obj в вашем примере? Если это локальная переменная области, в которой вызывается foo, к ней нельзя получить доступ изнутри foo, если вы не передадите текущую привязку в качестве второго параметра.

Если вы хотите получить доступ к переменной экземпляра @obj , это просто:

def foo(bar)
  instance_variable_get("@#{bar}").length
end

@obj = "lala"
foo("obj") #=> 4
12
ответ дан 3 December 2019 в 05:35
поделиться

Вы имеете в виду переменную или метод доступа? Sepp2k дал имя переменной экземпляра; для использования аксессуара

def foo(bar)
  self.send(bar).some_method_call
end
1
ответ дан 3 December 2019 в 05:35
поделиться

Вы почти наверняка не сможете. У этого определения не будет доступа к локальным переменным вызывающей области. Если вы хотите более подробно объяснить, что вы пытаетесь сделать, мы могли бы предложить полезную альтернативу.

0
ответ дан 3 December 2019 в 05:35
поделиться

Вы можете использовать eval

def foo(bar)
  eval(bar.to_s).some_method_call
end
5
ответ дан 3 December 2019 в 05:35
поделиться

Это немного странно, но если вы хотите передать пустой блок (или если вы все равно пропускаете его ), вы можете получить привязку из блока, затем вызвать 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)
3
ответ дан 3 December 2019 в 05:35
поделиться