Nieoczekiwane zachowanie tablicy - ruby, tablice, zmienne

Następujące modyfikować metoda w jakiś sposób modyfikuje całość @x tablica zamiast po prostu generować kolejny element, który zostanie później popchnięty. Dlaczego?

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

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

puts @x

Edytowane Poniższy kod załatwił sprawę. Wciąż zastanawiam się, czy można pozbyć się argumentu p

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

Odpowiedzi:

1 dla odpowiedzi № 1

Prawdopodobnie powinieneś przerobić od początku, ale w duchu drobnych zmian ... spróbuj zmienić swoją metodę, by zredukować efekty uboczne.

Jeśli chcesz zwrócić pojedynczy element Fixnum:

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

lub, jeśli chcesz zwrócić tablicę, aby wstrzyknąć do większej tablicy krotek

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

W duchu zrozumienia, powinieneś przeczytać o obiektach Ruby i ich odniesieniach oraz o tym, jak metody Ruby mają efekty uboczne.

Ucz się tego:

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

Możesz chcieć zrobić dupe

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

0 dla odpowiedzi nr 2

@x[-1] jest wewnętrzną tablicą [10, 12]. Ustawiłeś t aby odwołać się do tej tablicy. Następnie modyfikujesz tę tablicę za pomocą t[i] = część.


Najbardziej popularny