Ciao a tutti!
Sto’ cominciando a smanettare con Ruby e volevo leggere e scrivere file.
In Eclipse con il plugin RDT ho scritto:
$stdout.sync = true
def stampa_file nome_file
open nome_file.each do |riga|
riga.chomp!
puts riga
end
end
puts “”
puts “Inserisci il nome del file da stampare a video:”
nome_file = gets.chomp!
stampa_file nome_file
Il risultato dell’elaborazione è il seguente messaggio d’errore:
in `each_line’: no block given (LocalJumpError)
Cosa non mi è chiaro?
Grazie a tutti.
Ciao ciao!
Il Sistema wrote:
Ciao a tutti!
Sto’ cominciando a smanettare con Ruby e volevo leggere e scrivere file.
In Eclipse con il plugin RDT ho scritto:
$stdout.sync = true
def stampa_file nome_file
open nome_file.each do |riga|
riga.chomp!
puts riga
end
end
puts “”
puts “Inserisci il nome del file da stampare a video:”
nome_file = gets.chomp!
stampa_file nome_file
Il risultato dell’elaborazione è il seguente messaggio d’errore:
in `each’: no block given (LocalJumpError)
Cosa non mi è chiaro?
Grazie a tutti.
Ciao ciao!
Dopo averci perso una giornata (per questo avevo mollato e chiesto
aiuto… il mistero ha trovato soluzione. La open del file va fatta
così:
open(nome_file).each do |riga|
Scusate se ho preso spazio nel forum…
ciao ciao.
Il 25-08-2006 Il Sistema ha scritto:
open(nome_file).each do |riga|
Non necessariamente. Io preferisco
File.open(file_name) do |f|
f.each_line do |l|
puts l.chomp
end
end
così non ti scordi di chiudere il file, fra l’altro
Potrei dire una castronata, ma File.open *è *necessario a meno che non
fai un “include File”.
O sbaglio?
In ogni caso è buona prassi assicurarsi che usi proprio il metodo open
di File e non di qualche altro modulo, quindi sarei comunque propenso
per un “File.open(filename) do …”
Enrico F. wrote:
Il 25-08-2006 Il Sistema ha scritto:
open(nome_file).each do |riga|
Non necessariamente. Io preferisco
File.open(file_name) do |f|
f.each_line do |l|
puts l.chomp
end
end
così non ti scordi di chiudere il file, fra l’altro
Ah, caspita… ero convinto di ottenere la chiusura del file “a gratis”
da parte della open già con quel codice, ma avevo interpretato male la
documentazione: la open va passata subito al blocco che la elabora e non
dopo avergli applicato un metodo (each o each_line che sia) come avevo
fatto io.
Grazie per il prezioso suggerimento, mi ha risolto un po’ di rogne per
cui stavo per scrivere.
Ciao ciao!
P.S. File non e’ obbligatorio, pertanto il tutto diventa:
open(file_name) do |f|
f.each_line do |l|
puts l.chomp
end
end
david wrote:
Potrei dire una castronata, ma File.open *è *necessario a meno che non
fai un “include File”.
O sbaglio?
In ogni caso è buona prassi assicurarsi che usi proprio il metodo open
di File e non di qualche altro modulo, quindi sarei comunque propenso
per un “File.open(filename) do …”
Risultato: salta fuori File, insomma, una open di “sistema”!
Grazie, ciao ciao.
IMO è giusto usare File.open se si vuole essere sicuri
di accedere solo a file locali, altrimenti open è più
corto e permette più elasticità.
Ok, hai convinto almeno me. Ha senso quel che dici. “File.open” è più
leggibile, ma certamente meno flessibile e meno “Ruby”.
–
“Remember, always be yourself. Unless you suck.” - Joss Whedon
— Il Sistema [email protected] ha scritto:
david wrote:
Potrei dire una castronata, ma File.open *è
*necessario a meno che non
fai un “include File”.
O sbaglio?
Risultato: salta fuori File, insomma, una open di
“sistema”!
la open non qualificata richiama (in genere)
Kernel#open, che è un wrapper sopra File.open, ed è un
buon posto dove sbattere funzionalità aggiuntive non
specifiche del file system.
Insomma, sto cercando di dire che facendo “require
‘open-uri’” si possono aprire risorse ftp o http anche
se non sono File locali
Tra l’altro in ruby 1.9 Kernel#open usa un piccolo ed
utile protocollo, ovvero prova a richiamare un metodo
#to_open se esiste per cui è possibile aggiungere
facilmente classi “open-abili” (esempio: Pathname).
IMO è giusto usare File.open se si vuole essere sicuri
di accedere solo a file locali, altrimenti open è più
corto e permette più elasticità.
–
icq: #69488917
blog it: http://riffraff.blogsome.com
blog en: http://www.riffraff.info
Do You Yahoo!?
Poco spazio e tanto spam? Yahoo! Mail ti protegge dallo spam e ti da
tanto spazio gratuito per i tuoi file e i messaggi
http://mail.yahoo.it