Leggere e scrivere file in Ruby

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? :frowning:

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? :frowning:

Grazie a tutti.
Ciao ciao!

Dopo averci perso una giornata (per questo avevo mollato e chiesto
aiuto… :slight_smile: 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 …”

:slight_smile:

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. :wink:

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 …”

:slight_smile:

  • no, non serve e per curiosita’ ho scritto:

    puts open(“nome_del_file”).class

Risultato: salta fuori File, insomma, una open di “sistema”! :wink:

  • si, condivido!

Grazie, ciao ciao. :slight_smile:

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”.

:slight_smile:


“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?

  • no, non serve e per curiosita’ ho scritto:

    puts open(“nome_del_file”).class

Risultato: salta fuori File, insomma, una open di
“sistema”! :wink:

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 :slight_smile:

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