2009-03-07 18 views
19

Independientemente de si es una buena práctica o no, ¿cómo puedo llamar dinámicamente los métodos de acceso en Ruby?Cómo llamar dinámicamente a los métodos de acceso en Ruby

He aquí un ejemplo de clase:

class Test_Class 
    attr_accessor :a, :b 
end 

puedo utilizar el método Object.send para leer la variable ...

instance.a = "value" 
puts(instance.send("a")) 
# => value 

Pero estoy teniendo un mal rato tratando de escribir eso. Estos tiro "número incorrecto de argumentos (1 a 0) (ArgumentError)"

instance.send("a", "value") 

y

instance.method("a").call("value") 

Por favor, me ayudan a Stackoverflow!

Respuesta

44

No soy un experto en rubí, pero creo que se podía hacer:

instance.send("a=", "value") 
+0

Obras, genial! Supongo que el signo igual es parte del nombre del método? –

+0

Sí, el signo igual se utiliza de forma convencional para definir métodos de establecimiento en Ruby. Sin embargo, usaría un símbolo en lugar de una cadena. 'instance.send (: a =," value ")' –

+0

Sí. attr_accessor realiza dos métodos: def v; @v; fin y def v = (valor); @ v = valor; end – Angela

9

También puede acceder directamente a las variables de instancia de un objeto utilizando instance_variable_* funciones:

instance = Test_Class.new     # => #<Test_Class:0x12b3b84> 

# instance variables are lazily created after first use of setter, 
# so for now instance variables list is empty: 
instance.instance_variables    # => [] 

instance.instance_variable_set(:@a, 123) # => 123 
instance.a         # => 123 
instance.instance_variables    # => ["@a"] 
instance.instance_variable_get("@a")  # => 123 
Cuestiones relacionadas