2009-10-20 8 views
-2

La méthode de modification suivante modifie en quelque sorte l'ensemble de la matrice @x au lieu de générer simplement un autre élément à pousser ultérieurement. Comment venir?Comportement de tableau inattendu

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

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

puts @x 

Edité Le code suivant ont fait l'affaire. Cependant, je me demande s'il est possible de se débarrasser du p argument

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

Pouvez-vous préciser ce que vous essayez d'accomplir ici. Que voulez-vous que la méthode fasse? Aussi, pourquoi faites-vous référence à une variable d'instance spécifique ('@ x') dans la méthode, plutôt que, disons,' self'? – Telemachus

+0

il est clair exactement pourquoi cette méthode modifie l'ensemble @x. on ne sait pas ce que vous essayez d'accomplir. Quelle est l'application de cela? pouvez-vous élaborer sur le contexte? – avguchenko

+0

Je suis en train de modifier un vecteur partagé (@x [-1]), puis j'applique une version modifiée au tableau @x. – gmile

Répondre

0

@x[-1] est la matrice intérieure [10, 12]. Vous définissez t pour référencer ce tableau. Vous modifiez ensuite ce tableau avec la partie t[i] =.

+0

comment puis-je régler t-variable de ne pas référence, mais pour choisir uniquement la valeur? – gmile

+2

Clonez-le. 't = @x [-1] .clone' – Chuck

+0

perdre le t [i] = et le remplacer par une nouvelle variable – avguchenko

1

Vous devriez probablement refaire depuis le début, mais dans l'esprit de petits changements ... essayez de changer votre méthode pour réduire les effets secondaires.

Si vous voulez retourner un seul élément Fixnum:

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

ou, si vous voulez retourner un tableau à injecter dans le plus vaste éventail de tuples

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

Dans l'esprit de compréhension , vous devriez lire sur les objets Ruby et comment ils sont des références et comment les méthodes Ruby ont des effets secondaires.

Étude ceci:

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

Vous voudrez peut-être faire une dupe

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

trop de sous-variables ... y at-il une chance de passer la valeur, pas le * lien *? – gmile

+0

@Bob Aman: ici, nous n'avons pas besoin de la dupe parce que j'ai changé t [i] = ... à r = ... – avguchenko

+0

Cela ne supprime pas seulement l'effet secondaire, il change également le type de retour de la méthode. Auparavant, il renvoyait un tableau. Cette version renvoie un nombre entier. Comme il semble être un tableau de tableaux, c'est probablement incorrect. – Chuck

Questions connexes