J'ai beaucoup recherché mais malheureusement, je n'ai pas pu trouver une solution à cette question sûrement souvent posée.
En Perl, je peux réaffecter une matrice entière dans une fonction et avoir mes modifications reflétées en dehors de la fonction: J'essaie d'apprendre de rubis et j'ai écrit une fonction où je voudrais Changer un tableau après avoir exécuté la fonction, éléments CODE> en place en filtrant des éléments de sortie correspondant à une condition et renvoyer les éléments supprimés: p> Articles Code> retourne à son état avant d'appeler la fonction. Comment devrais-je m'approcher cela s'il vous plaît? P> p>
4 Réponses :
Je rechercherais Aussi passer par valeur / référence dans rubis code>. Voici une première fois HTTPS: // mixandgo.com/learn/is-ruby-pass-by-reference-or-pass-by-value .
Vous passez la valeur de référence de éléments code> à la fonction, pas la référence à éléments code>. Variable éléments code> est défini hors de la portée de la méthode et fait toujours référence à la même valeur, à moins que vous ne le réaffectez pas dans la portée variable. P>
filtreems code> n'est pas style rubis, voir https://rubystyle.guide/ p>
Je ne pense pas que ce soit correct. Si je viens de réaffecter un élément de la matrice, alors éléments code> changera: def filtre_items (éléments); articles [0] = 100; finir; articles = [1, 2]; filtre_items (éléments); P items # imprime [100, 2] code>
Ma faute, il y a une autre option de recherche ruby mutating / non mutation code> et il devrait vous donner lancechool.com/blog/mutation-and-non-mutant-methods . partition code> NE MUTATE et l'attribution de la valeur d'Array mutent le tableau
Vrai, merci d'avoir trouvé ces articles. Je vais modifier ma question à demander si quelqu'un a écrit une fonction de contourner ce comportement par défaut.
J'aimerais modifier des éléments de matrice en place en filtrant des éléments correspondant à une condition et en renvoyant les éléments retirés [...] Comment dois-je m'approcher s'il vous plaît? P>
vous pourriez
remplacer code >le contenu de la matrice dans votre méthode: p>xxx pré> blockQuote>
Soyez conscient du temps passé au débogage «Qui muté des articles?»
... ou éléments [0 ..- 1] = conservé code>.
Pour accéder ou modifier une variable extérieure dans un bloc, déclarez la variable à l'extérieur du bloc. Pour accéder à une variable en dehors d'une méthode, rangez-la dans une variable d'instance ou de classe. Il y en a beaucoup plus que cela, mais cela couvre le cas d'utilisation dans votre message d'origine. P>
Dans RUBY, vous avez des portes et des fermetures de portée. En particulier, les méthodes et les blocs représentent des portes de la portée, mais il existe certainement des moyens (routine et méta) pour accéder aux variables en dehors de votre portée locale. P>
dans une classe, ceci est généralement géré par des variables d'instance. Ainsi, comme un exemple simple de # Corder # A> (parce qu'il est plus facile d'expliquer que OUBERY # il va modifier ce qui est passé et l'attribuera ensuite à la variable d'instance en dehors de la méthode. Page / Attribuez-le à la variable d'instance en dehors de la méthode. p> Si vous ne voulez vraiment pas transmettre les choses comme des arguments, ou si @items em> devrait être un tableau, alors vous pouvez certainement fais ça aussi. Cependant, les matrices se comportent différemment, donc je ne suis pas sûr de ce que vous attendez vraiment de la partition de tableau (qui est hérité d'une énumérable) à céder. Cela fonctionne, en utilisant Enumérable # SLICE_AFTER : P> Les tableaux de partitionnement au lieu de chaînes h2>
class Filter
def initialize
@items = []
end
def filter_array items, separator
@items = [3,4,5].slice_after { |i| i == separator }.to_a.pop
end
end
f = Filter.new
f.filter_array [3, 4, 5], 4
#=> [5]
Regardez dans la
Voici un Array # Push : p> p>
Voici un Array # Insert : p>
Voici un exemple avec un bang fort>
ary = [1,2,3,4,5]
def bar(ary)
ary.map! { |e| e**2 }
end
bar(ary)
ary
#=> [1, 4, 9, 16, 25]