ruby hinzufügen Wert der variable um ein array
Habe ich ein Ruby-1.8.6-Skript, das nehmen sollen, um einen Dateinamen, einen Pfad enthält, erstellen Sie die Ordner dann verschieben Sie die Datei in den Ordner. Ich habe ein array created_paths
zu halten, verfolgt der Ordner erstellt (das script wird eine Schleife durch viele Dateien). Ich habe ein problem hinzufügen der created_paths
array.
created_paths = Array.new
file_name = "first\\second\\third.txt"
parts = file_name.split('\\')
tmp_path = ""
parts.each_with_index { |part,i|
if i == (parts.length - 1)
# copy file to new dir structure
else
tmp_path << part << "/"
if !created_paths.include?(tmp_path)
puts "add to array: #{tmp_path}"
created_paths.push(tmp_path)
# create folder
end
end
}
puts "size=#{created_paths.length}\n"
created_paths.each { |z| print z, "\n " }
Wenn ich push tmp_path
auf der created_paths
array scheint es den Verweis auf tmp_path
Hinzugefügt wurde und nicht der Wert. Auf der zweiten iteration der Schleife created_paths.include?(tmp_path)
wird True zurückgeben. Wie bekomme ich den Wert von tmp_path
gespeichert werden, in meinem array, oder vielleicht gibt es ein scope Problem mir fehlt ?
Meine Ausgabe:
add to array: first/
size=1
first/second/
Meinem vorbehalten Ausgabe:
add to array: first/
add to array: first/second/
size=2
first/
first/second/
InformationsquelleAutor Mark | 2010-03-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie
tmp_path.dup
Klonen Sie die Zeichenfolge, bevor Sie es auf die array.Aber ich verstehe nicht, warum Sie das tun (halten Sie die Liste der Verzeichnisse angelegt). Werfen Sie einen Blick auf FileUtils#mkdir_p, übergeben Sie es einem Pfad zu einem Verzeichnis, das Sie erstellen möchten, und Sie schafft es, zusammen mit all den fehlenden übergeordneten Verzeichnisse.
InformationsquelleAutor Mladen Jablanović
Alles in ruby ist unter Bezugnahme.
Wenn Sie << du bist die Verkettung der Zeichenfolge. Mit dem dup-Methode sollte für Sie arbeiten.
In der obigen snippet-set << für die Zuordnung Zeichenfolge mit " = " und sehen den Unterschied in der Ausgabe.
Auch als Randnotiz in ruby können Sie nur nutzen bringt, fügen Sie einen Zeilenumbruch beim drucken.
so
created_paths.each { |z| print z, "\n " }
Lesen konnte
created_paths.each { |z| puts z }
InformationsquelleAutor Beanish
Das Problem ist, dass diese Zeile geändert wird, die ursprüngliche string-Objekt. Das array enthält einen Verweis auf das Objekt.
Um dies zu vermeiden, müssen Sie ein neues Objekt erstellen. Entweder tun Sie dies, wenn Sie fügen Sie die Pfade
Oder tun:
Entweder Weg, Sie machen ein neues string-Objekt, sondern als Modifizierung des bereits vorhandenen.
InformationsquelleAutor AShelly