0
votes

Réaffecter la matrice totale à la même référence

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: xxx

J'essaie d'apprendre de rubis et j'ai écrit une fonction où je voudrais Changer un tableau éléments en place en filtrant des éléments de sortie correspondant à une condition et renvoyer les éléments supprimés: xxx

après avoir exécuté la fonction, Articles retourne à son état avant d'appeler la fonction. Comment devrais-je m'approcher cela s'il vous plaît?


0 commentaires

4 Réponses :


0
votes

Je rechercherais passer par valeur / référence dans rubis . 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 à la fonction, pas la référence à éléments . Variable éléments 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.

Aussi filtreems n'est pas style rubis, voir https://rubystyle.guide/


3 commentaires

Je ne pense pas que ce soit correct. Si je viens de réaffecter un élément de la matrice, alors éléments changera: def filtre_items (éléments); articles [0] = 100; finir; articles = [1, 2]; filtre_items (éléments); P items # imprime [100, 2]


Ma faute, il y a une autre option de recherche ruby ​​mutating / non mutation et il devrait vous donner lancechool.com/blog/mutation-and-non-mutant-methods . partition 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.



2
votes

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?

vous pourriez remplacer le contenu de la matrice dans votre méthode: xxx


2 commentaires

Soyez conscient du temps passé au débogage «Qui muté des articles?»


... ou éléments [0 ..- 1] = conservé .



0
votes

TL; DR

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>

Explication et exemples H2>

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>

Les tableaux de partitionnement au lieu de chaînes h2>

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>

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]


0 commentaires

0
votes

Regardez dans la Array strong> Classe pour n'importe quelle méthode qui transforme l'objet, par exemple toute la méthode avec une bang ou des méthodes qui insère des éléments.


Voici un Array # Push : p> xxx pré>

p>


Voici un Array # Insert : xxx pré>

p>


Voici un exemple avec un bang fort> Array # Rejeter! : P>

ary = [1,2,3,4,5]

def bar(ary)
  ary.map! { |e| e**2 }
end

bar(ary)
ary
#=> [1, 4, 9, 16, 25]


0 commentaires