2013-03-29 3 views
0

Je pensais Array # supprimer supprimé toutes les copies d'un objet dans un tableau, mais des choses étranges (et inexplicables pour moi) se produisent dans ce programme que j'écris. Delete ne semble fonctionner que lorsque j'inclus un bang à la fin de la fonction delete, même si cela ne semble pas être défini.Ruby array supprimer vs supprimer (bang)

Voici la fonction en question:

def propagate 
    @puzzle.each do |sqr, values| 
     if values.length == 1 
     @neighbors[sqr].each do |neighbor| 
      @puzzle[neighbor].delete!(values) 
     end 
     end 
    end 
    end 

@puzzle est un hachage avec des chaînes comme clés et des valeurs, formatés comme ceci: @puzzle["A1"] = "123456789"

@neighbors est un hachage avec des chaînes comme clés et tableaux des chaînes comme valeurs:

@neighbors["A1"] = ["A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9", "B1", "C1", "D1", "E1", "F1", "G1", "H1", "I1", "B2", "B3", "C2", "C3"] 

quand je lance le code comme ceci: @puzzle[neighbor].delete(values)

Les valeurs en puzzle ne sont pas affectées par la suppression. Mais quand j'inclus le! Ça marche.

Pourquoi est-ce?

+0

La chose est dans IRB j'ai essayé de dupliquer le scénario, et l'interpréteur ne reconnaît même pas 'delete!'. En outre, la suppression régulière mute le tableau comme prévu dans irb. – ordinary

+0

J'ai également essayé de créer un autre script et de l'exécuter 'a = [% w (1 2 3)]; a.delete! ("1") ' Mais j'ai NoMethodError ... Qu'est-ce qui donne? – ordinary

Répondre

5

C'est un idiome commun. Les méthodes Bang modifient l'objet sur place, les méthodes "normales" renvoient une copie modifiée.

L'appel de méthode delete! que vous effectuez est effectué par rapport à une chaîne et non à un tableau. Et String a en effet la méthode delete!: http://www.ruby-doc.org/core-1.9.3/String.html#method-i-delete-21

+0

Cependant, 'Array # delete' _does_ modifie le tableau en place (et il n'y a pas de version bang). – JKillian