stavo cercando di scrivere una semplice funzione che ricorsivamente
stampi tutti i file presenti in una cartella e nelle sue
sottocartelle, definita nel seguente modo:
def walk_dir(dir)
Dir.foreach(dir) do |file|
if File.directory?(file)
walk_dir(file)
else
puts “file -> #{file}”
end
end
end
dir = “C:/Appoggio/ruby”
walk_dir(dir)
Ora, quando eseguo lo script, mi restituisce:
dir_walk.rb:16:in walk_dir': stack level too deep (SystemStackError) from dir_walk.rb:18:inwalk_dir’
from dir_walk.rb:16:in foreach' from dir_walk.rb:16:inwalk_dir’
from dir_walk.rb:18:in walk_dir' from dir_walk.rb:16:inforeach’
from dir_walk.rb:16:in walk_dir' from dir_walk.rb:18:inwalk_dir’
from dir_walk.rb:16:in `foreach’
… 1270 levels…
stavo cercando di scrivere una semplice funzione che
ricorsivamente
stampi tutti i file presenti in una cartella e nelle
sue
sottocartelle, definita nel seguente modo:
credo che Dir[‘**/*’] farebbe al caso tuo (globbing in
stile zsh)
dir = “C:/Appoggio/ruby”
from dir_walk.rb:16:in foreach' from dir_walk.rb:16:in walk_dir’
from dir_walk.rb:18:in walk_dir' from dir_walk.rb:16:in foreach’
… 1270 levels…
C’è qualche escamotage? Sbaglio qualcosa io?
quando hai uno stack overflow a causa di una funzione
ricorsiva l’approccio standard è srotolare la
ricorsione e gestire lo stack a mano. Quindi invece di
avere
def foo(a)
val = fai_cose(a)
foo(val)
end
la fai diventare
def foo(a)
stack=[a]
while tmp = stack.pop
stack.push( fai_cose(tmp) )
end
end
o una cosa del genere
Ma nel tuo caso, ripeto, non ne hai bisogno perché
esistono già funzioni equivalenti a os.walk.
Non sono pratico di windows ma direi che al 99,999999% il problema è
che tu non scarti dalla ricorsione le directory speciali . e …
Finisci in una ricorsione infinita che ti satura lo stack.
A parte questo ci sono modi migliori per fare quello che vorresti,
come ti hanno fatto notare.
Non sono pratico di windows ma direi che al 99,999999% il problema è
che tu non scarti dalla ricorsione le directory speciali . e …
Finisci in una ricorsione infinita che ti satura lo stack.
Hai ragione, in effetti non avevo pensato a . e …! Che pirla… :\