variable metodo instancia initialize herencia clases clase ruby metaprogramming

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