Eintrag in einem Array ändern, während es durchlaufen wird

8
%Vor%

Der obige Code gibt aus:

%Vor%

aber warum nicht?

%Vor%

Ich dachte, dass Farbe eine Referenz auf das aktuelle Element in dem Array ist, und was auch immer ich dazu getan habe, würde dieses Array-Element beeinflussen?

    
pingu 21.02.2011, 08:35
quelle

4 Antworten

5

Wenn Sie sich im Block arr.each befinden, ist die Variable colour an eines der Objekte im Array arr gebunden.

Sobald Sie jedoch im Block die Zuweisung colour = "green" vornehmen, wird die Variable colour an ein neues Objekt (nämlich einen String mit dem Wert "green" ) und das ursprüngliche arr gebunden. bleibt unberührt.

Ein Weg, um zu erreichen, worüber du sprichst, wäre:

%Vor%

welches das Array direkt manipuliert.

    
sflinter 21.02.2011, 08:49
quelle
4

Die Farbe ist in der Tat eine Referenz auf das aktuelle Element im Array, aber mit 'color="green"' verweist sie jetzt auf eine neue Zeichenkette. Der alte bleibt unverändert. Versuchen Sie zu experimentieren,

zu ersetzen %Vor%

mit einem oder mehreren von

%Vor%

Alle funktionieren mit der vorhandenen Zeichenfolge und erstellen keine neue Zeichenfolge.

    
steenslag 21.02.2011 08:54
quelle
4

Um ein Array in ein anderes Array zu transformieren, verwenden Sie in Ruby nicht die Methode each , sondern die Methode map (Code nach Benutzer sflinter oben):

%Vor%

Oder, um ein bisschen allgemeiner zu sein, mit der Transformationskarte:

%Vor%

wir können etwas wie

tun %Vor%

PS: Wie von Phrogz unten vorgeschlagen, erstellt map eine neue Instanz von array. Wenn Sie das modifizierte Array in der gleichen Variable belassen möchten, sollten Sie ihm das Ergebnis von map zuweisen.

Andererseits gibt es map 's bösen Zwilling namens map! , der das ursprüngliche Array in-place modifiziert (also keine Notwendigkeit, es zurück zuweisen), spart etwas Raum und Zeit, aber bricht das reine Funktional Programmierkonzept, dass Funktionen keine Nebenwirkungen haben sollten.

    
Mladen Jablanović 21.02.2011 10:48
quelle
2

Was ich gerade schreiben möchte, ist not der empfohlene Weg, dies zu tun, aber beachten Sie, dass, da Strings in Ruby veränderbar sind, Sie den ursprünglichen Code wie folgt schreiben könnten:

%Vor%     
Phrogz 21.02.2011 12:59
quelle

Tags und Links