2010-12-06 5 views
6

No estoy seguro que este patrón se llama, pero aquí está el panorama:Ruby: ¿Es posible establecer el valor de una variable de instancia donde la variable de instancia se nombra mediante una cadena?

class Some 
    #this class has instance variables called @thing_1, @thing_2 etc. 
end 

¿Hay alguna manera de establecer el valor de la variable de instancia en la instancia nombre de la variable es creada por una cadena?

Algo así como:

i=2 
some.('thing_'+i) = 55 #sets the value of some.thing_2 to 55 
+3

"No estoy seguro que este patrón se denomina" - 'Array'. –

Respuesta

17

Búsqueda de “instance_variable” en Object:

some.instance_variable_get(("@thing_%d" % 2).to_sym) 
some.instance_variable_set(:@thing_2, 55) 

Este patrón se conoce como “caricias”; puede ser una mejor idea usar explícitamente un Hash o Array si va a computar claves como esta.

+10

+1 por "acariciar". –

+0

+0 por "acariciar". No quiero actuar como una estrella pr0n. –

2

Puede generar métodos de acceso para aquellas variables de instancia y luego simplemente send setters:

class Stuff 
    attr_accessor :thing_1, :thing_2 
end 

i = 1 
s = Stuff.new 
s.send("thing_#{i}=", :bar) 
s.thing_1 # should return :bar 
0

me preguntaba lo mismo, así que he estado jugando con la consola. cosas divertidas:

class Parent 
    class << self 
    attr_accessor :something 

    def something(value = nil) 
     @something = value ? value : @something 
    end 

    def inherited(subclass) 
     self.instance_variables.each do |var| 
     subclass.instance_variable_set(var, self.instance_variable_get(var)) 
     end 
    end 
    end 

    attr_accessor :something 
    self.something = 'Parent Default' 

    def something(value = nil) 
    @something = value ? value : @something ? @something : self.class.something 
    end 
end 

class Child < Parent 
    # inherited form Parent.something 
end 

class GrandChild < Child 
    something "GrandChild default" 
end 

Resultados: en

Parent.something 
# => "Parent Default" 
Parent.something = "Parent something else" 
# => "Parent something else" 
Parent.something 
# => "Parent something else" 
parent = Parent.new 
# => #<Parent:0x007fc593474900> 
parent.something 
# => "Parent something else" 
parent.something = "yet something different" 
# => "yet something different" 
parent.something 
# => "yet something different" 
parent.class.something 
# => "Parent something else" 
Child.something 
# => "Parent Default" 
child = Child.new 
# => #<Child:0x007fc5934241f8> 
child.something 
# => "Parent Default" 
GrandChild.something 
# => "GrandChild default" 
GrandChild.something("grandchild something else") 
# => "grandchild something else" 
GrandChild.something 
# => "grandchild something else" 
GrandChild.superclass.something 
# => "Parent Default" 
grandchild = GrandChild.new 
# => #<GrandChild:0x007fc5933e70c8> 
grandchild.something 
# => "grandchild something else" 
grandchild.something = "whatever" 
# => "whatever" 
GrandChild.something 
# => "grandchild something else" 
grandchild.something 
# => "whatever" 
Cuestiones relacionadas