Unerwartetes Array-Verhalten - Ruby, Arrays, Variablen

Folgende ändern Methode modifiziert irgendwie das Ganze @x Array statt einfach nur ein anderes Element zu generieren, das später verschoben wird. Woher?

def modify i, s
t = @x[-1]
t[i] = t[i] + s
t
end

@x = [ [10, 12] ]
@x << modify(0, 1)

puts @x

Bearbeitet Der folgende Code hat den Trick gemacht. Dennoch frage ich mich, ob es möglich ist, das p-Argument loszuwerden

def modify p, i, s
a = p.to_a
a[i] += s*@delta[i]
Vector.elements( a )
end

Antworten:

1 für die Antwort № 1

Sie sollten wahrscheinlich von Anfang an wiederholen, aber im Geiste der kleinen Änderungen ... versuchen Sie Ihre Methode zu ändern, um Nebenwirkungen zu reduzieren.

Wenn Sie ein einzelnes Fixnum-Element zurückgeben möchten:

def modify i, s
t = @x[-1]
r = t[i] + s
r
end

oder, wenn Sie ein Array zurückgeben wollen, um es in das größere Array von Tupeln zu injizieren

def modify i, s
t = @x[-1].dup
t[i] = t[i] + s
t
end

Im Geiste des Verständnisses sollten Sie Ruby-Objekte lesen und herausfinden, wie sie Referenzen sind und wie Ruby-Methoden Nebenwirkungen haben.

Lerne das:

a=[1,2]
b=a
b[0]=4
puts a
> [4,2]

Vielleicht möchten Sie einen Betrogenen tun

a=[1,2]
b=a.dup
b[0]=4
puts a
> [1,2]

0 für die Antwort № 2

@x[-1] ist das innere Array [10, 12]. Sie setzen t um dieses Array zu referenzieren. Sie ändern dann dieses Array mit dem t[i] = Teil.


Am beliebtesten