Получите значение переменной экземпляра, данной ее имя

Поскольку запись здесь является результатами на Mac:

>>> import os
>>> os.name
'posix'
>>> import platform
>>> platform.system()
'Darwin'
>>> platform.release()
'8.11.1'
94
задан the Tin Man 6 November 2015 в 20:41
поделиться

2 ответа

Самый идиоматический способ добиться этого:

some_object.instance_variable_get("@#{name}")

Нет необходимости использовать + или стажер ; Ruby прекрасно с этим справится. Однако, если вы обнаруживаете, что тянетесь к другому объекту и вытаскиваете его ivar, есть достаточно хороший шанс, что вы нарушили инкапсуляцию.

Если вы явно хотите получить доступ к ivar, правильным решением будет сделать его средством доступа . Примите во внимание следующее:

class Computer
  def new(cpus)
    @cpus = cpus
  end
end

В этом случае, если бы вы сделали Computer.new , вы были бы вынуждены использовать instance_variable_get для доступа к @cpus . Но если вы делаете это, вы, вероятно, имеете в виду, чтобы @cpus был общедоступным. Что вам следует сделать:

class Computer
  attr_reader :cpus
end

Теперь вы можете сделать Computer.new (4) .cpus .

Обратите внимание, что вы можете повторно открыть любой существующий класс и сделать частный ivar в читателе. Поскольку аксессор - это всего лишь метод, вы можете выполнить Computer.new (4) .send (var_that_evaluates_to_cpus)

172
ответ дан 24 November 2019 в 06:06
поделиться

To get an instance variable from the name of an instance variable do:

name = "paramName"
instance_variable_get(("@" + name).intern)

This will return the value of the instance variable @paramName

9
ответ дан 24 November 2019 в 06:06
поделиться