2017-02-15 5 views
0

Doing mein Code Ich bin auf einige Schwierigkeiten gestoßen, die ich nicht ganz verstehe (ich bin ziemlich neu in Ruby). Dies ist ein BeispielReihenfolge der Operationen in Ruby

temp = [] 
temp_groups_data = [] 
search_text_user = %r{AD-|Domain} 
groups_data.each do |arr| 
    temp_groups_data << arr 
    arr.delete_at(0) 
    arr.each do |el| 
    temp << (el) unless el =~ search_text_user 
    end 
end 

Wenn ich versuche temp_groups_data Array im nächsten Teil des Codes zu verwenden ich mit gelöschten Wert ein Array erhalten bei 0. Ich verstehe nicht, warum, weil dieses Array erstellt wird, bevor Artikel deteting damit der Wert drin ist, warum nicht? Was ist die Reihenfolge der Operationen in Ruby? Wie man das Array dupliziert und es im nächsten Teil des Codes nützlich macht?

+0

setzen Können Sie uns zeigen, was 'groups_data' aussieht? Es ist ein bisschen schwer zu folgen, ohne sein Format zu sehen. Könnten Sie auch erklären, was Sie erreichen wollen/was sollte das Endergebnis sein? Es gibt viele Abkürzungen in Ruby und es gibt wahrscheinlich eine kürzere und sauberere Art, dies auszudrücken. – Glyoko

+0

groups_data array 'groups_data = [[" gruppe1 "," benutzer_1 "," benutzer_2 "," benutzer_3 "], [" gruppe3 "," benutzer_1 "], [" gruppe4 "," benutzer_2 "]]' Ich möchte Um dieses Array in diesem Formular im nächsten Teil des Codes zu verwenden, erhalte ich das neue Array mit dem gelöschten Element bei 0 wie im obigen Code. – mila002

Antwort

1

Die arr in temp_group_data und die arr Sie delete_at(0) rufen sind die gleichen Array. Auf dieselben Daten wird auf verschiedene Arten zugegriffen.

Hier ist ein vereinfachtes Beispiel, was passiert:

x = [] 
y = [:a, :b] 
x << y 
p x #=> [[:a, :b]] 
y.delete_at(0) 
p x #=> [[:b]] 

Die einfachste Änderung wäre nur arr zu kopieren, bevor es in temp_groups_data

temp = [] 
temp_groups_data = [] 
search_text_user = %r{AD-|Domain} 
groups_data.each do |arr| 
    temp_groups_data << arr.dup # this right here 
    arr.delete_at(0) 
    arr.each do |el| 
    temp << (el) unless el =~ search_text_user 
    end 
end 
+0

Ok, das ist Arbeit. Also, wenn ich gut verstanden Operation wie diese temp_groups_data = groups_data.dup vor jeder Iteration auch das gleiche Array produzieren? Woran sollte ich mich beim nächsten Mal erinnern, Objekte zu duplizieren, ich meine kompliziertere Arrays oder Hashes? – mila002

+0

Siehe [diese Frage] (http://stackoverflow.com/questions/38841444/using-self-dup-but-failing-rspec-test-to-not-modify-original-array) und [meine Antwort darauf] (http://stackoverflow.com/questions/38841444/using-self-dup-but-failing-rspec-test-to-not-modify-original-array/38841559#38841559), könnten sie dazu beitragen, die Dinge besser zu erklären als ich kann in einem Kommentar tun. – philomory

Verwandte Themen