ruby - metodo - Obtenga el valor de una variable de instancia dado su nombre
variables de clase (2)
La forma más idiomática de lograr esto es:
some_object.instance_variable_get("@#{name}")
No es necesario usar +
o intern
; Ruby se encargará de esto bien. Sin embargo, si te encuentras llegando a otro objeto y sacando su ivar, hay una posibilidad bastante buena de que hayas roto la encapsulación.
Si explícitamente desea acceder a un ivar, lo correcto es hacerlo un acceso. Considera lo siguiente:
class Computer
def new(cpus)
@cpus = cpus
end
end
En este caso, si hiciera Computer.new
, se vería obligado a usar instance_variable_get
para obtener @cpus
. Pero si estás haciendo esto, probablemente @cpus
que @cpus
sea público. Lo que debes hacer es:
class Computer
attr_reader :cpus
end
Ahora puedes hacer Computer.new(4).cpus
.
Tenga en cuenta que puede volver a abrir cualquier clase existente y convertir un ivar privado en un lector. Como un Computer.new(4).send(var_that_evaluates_to_cpus)
acceso es solo un método, puede hacer Computer.new(4).send(var_that_evaluates_to_cpus)
En general, ¿cómo puedo obtener una referencia a un objeto cuyo nombre tengo en una cadena?
Más específicamente, tengo una lista de los nombres de los parámetros (las variables miembro - construidas dinámicamente, así que no puedo referirme a ellas directamente).
Cada parámetro es un objeto que también tiene un método from_s
.
Quiero hacer algo como lo siguiente (que por supuesto no funciona ...):
define_method(:from_s) do | arg |
@ordered_parameter_names.each do | param |
instance_eval "field_ref = @#{param}"
field_ref.from_s(param)
end
end
Para obtener una variable de instancia del nombre de una variable de instancia, haga lo siguiente:
name = "paramName"
instance_variable_get(("@" + name).intern)
Esto devolverá el valor de la variable de instancia @paramName