2016-06-04 9 views
1

Ermöglicht eine Klasse wie dieses:Rubin - Wie eine Instanzvariable in verschiedenen Objekten ändern Karte Methode

class Foo 
    attr_accessor :var_1, :var_2, :var_3 

    def initialize(var_1, var_2, var_3) 
    @var_1 = var_1 
    @var_2 = var_2 
    @var_3 = var_3 
    end 
end 

und jetzt schaffen wir einige Objekte:

a = Foo.new("c", 1, "d") 
b = Foo.new("e", 2, "f") 
c = Foo.new("g", 3, "h") 

dann machen wir ein Array mit den neu erstellten Objekte:

array = [a, b, c] 

Und hier, wo ich fest, ich will einen neuen Wert auf eine bestimmte Instanz var hinzufügen iable vom Objekt.

Beispiel:

Ich versuche var_2 um eins erhöht sich ändern, aber ich weiß nicht, wie es zu der Instanz Variable var_2 anrufen oder zuweisen:

newArray = array.map { |x| 

    x.var_1 + 1 # assign the new value to the instance variable 'var_2' 
} 

def showArray(array) 

    array.each do | var | 
    puts "Var 1: #{var.var_1} | Var 2: #{var.var_2} | Var 3: #{var.var_3}" 
    end 
end 

showArray(newArray) 

# desired output: 
# => Var 1: c | Var 2: 2 | Var 3: d 
# => Var 1: e | Var 2: 3 | Var 3: f 
# => Var 1: g | Var 2: 4 | Var 3: h 

Ich habe zu verwenden, die Kartenmethode.

Antwort

2

Das Problem, das Sie haben, ist, dass Ihre map Funktion den Wertzurückgibt, der eine Integer ist. Wenn Sie über es zurückschleifen, durchlaufen Sie die Schleife Integer s nicht Foo Objekte.

Sie haben es fast, man muss nur wie +=-assignval_2 sich + 1 wie diese einen Zuweisungsoperator verwenden:

newArray = array.map { |x| 
    x.var_2 += 1 
    x 
} 

def showArray(array) 

    array.each do | var | 
    puts "Var 1: #{var.var_1} | Var 2: #{var.var_2} | Var 3: #{var.var_3}" 
    end 
end 

showArray(newArray) 

Ausgabe:

Var 1: c | Var 2: 2 | Var 3: d 
Var 1: e | Var 2: 3 | Var 3: f 
Var 1: g | Var 2: 4 | Var 3: h 
Verwandte Themen