Поскольку запись здесь является результатами на Mac:
>>> import os
>>> os.name
'posix'
>>> import platform
>>> platform.system()
'Darwin'
>>> platform.release()
'8.11.1'
Самый идиоматический способ добиться этого:
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)
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