Precedenze di stampa

Salve,
sono nuovo sia della mailing list che di ruby :-D. Stavo scrivendo del
codice giocattolo per imparare
ad usare ruby e ad avere confidenza con la sintassi.

#!/usr/bin/ruby

class Cane
def initialize
puts “sto creando il cane”
end

def abbaia
puts "bau " * 3
end
end

cane = Cane.new

(1…3).each do |x|
puts "#{x} #{cane.abbaia} "
end

Le precedenti linee di codice stampano:

sto creando il cane
bau bau bau
1 bau bau bau
2 bau bau bau
3

Ok…nei diversi linguaggi con i quali ho avuto a che fare posso
stampare “senza trucchi” nell’ordine che specifico banalmente. Come mai
in questo caso prima viene stampato l’output del metodo abbaia e
successivamente la X con dentro il valore corrente del RANGE?
E’ possibile che dica qualche scemenza vista l’ora tarda…però mi sembra
così strano quello che stampa.
Ringrazio in anticipo per l’eventuale spiegazione.

Samuele M.

2010/5/12 Samuele M. [email protected]

end

cane = Cane.new

(1…3).each do |x|
puts "#{x} #{cane.abbaia} "
end

Rimuovi il puts da abbaia.

http://thinkcode.tv - High-Quality Programming Screencasts
http://antoniocangiano.com - Zen and the Art of Programming
http://math-blog.com - Mathematics is wonderful!
Follow me on Twitter: http://twitter.com/acangiano

Il giorno 13 maggio 2010 01.25, Samuele M.
[email protected]ha scritto:

   end

(1…3).each do |x|

Ok…nei diversi linguaggi con i quali ho avuto a che fare posso stampare
“senza trucchi” nell’ordine che specifico banalmente. Come mai in questo
caso prima viene stampato l’output del metodo abbaia e successivamente la X
con dentro il valore corrente del RANGE?
E’ possibile che dica qualche scemenza vista l’ora tarda…però mi sembra
così strano quello che stampa.
Ringrazio in anticipo per l’eventuale spiegazione.

Il comportamente del tuo script è corretto. Dentro il metodo Cane#abbaia
viene invocato il metodo “puts”. Il metodo “puts” stampa sullo STDIN la
stringa “bau bau bau” e ritorna nil (così dice la documentazione di
Kernel#puts). In Ruby ogni metodo, in mancanza di un “return” esplicito,
ritorna il valore ritornato dall’ultimo statement eseguito. Il metodo
Cane#abbaia ritorna sempre quello che ritorna “puts” e quindi ritorna
sempre
e comunque “nil”.

Ricampitolando: Cane#abbaia stampa su STDIN “bau bau bau” e ritorna
nil.

Nel codice:

(1…3).each do |x|
puts "#{x} #{cane.abbaia} "
end

quando l’interprete arriva alla riga:
puts "#{x} #{cane.abbaia} "
invoca il metodo Cane#abbia, il quale stampa “bau bau bau” e ritorna
nil:
puts "#{x} #{nil} "
nil viene convertito in stringa, il suo valore in stringa, se non
ricordo
male, è la stringa vuota, quindi potremmo riscrivere la riga come:
puts "#{x} "
e quindi stampa solo l’indice x.

Da questo si capisce perchè in realtà la stringa “bau bau bau” venga
stampata prima dell’indice. Se vuoi che venga stampata dopo l’indice
devi
rimuovere il “puts” da Cane#abbaia:
def abbaia
return "bau " * 3
end
o, più semplicemente:
def abbaia
"bau " * 3
end

In questo modo Cane#abbia ritorna sempre “bau bau bau” e
verrà correttamente
stampato dopo l’indice :smiley:

ciao,
Andrea

Il giorno 13 maggio 2010 10.58, Luca De Marinis [email protected] ha
scritto:

2010/5/13 Gendag [email protected]:

Il comportamente del tuo script è corretto. Dentro il metodo Cane#abbaia
viene invocato il metodo “puts”. Il metodo “puts” stampa sullo STDIN la

Non sara’ lo STDOUT? :wink: stampare sull’input e’ un po’ difficile, non
solo in ruby :wink:

Già, lapsus mio :smiley:
Andrea

2010/5/13 Gendag [email protected]:

Il comportamente del tuo script è corretto. Dentro il metodo Cane#abbaia
viene invocato il metodo “puts”. Il metodo “puts” stampa sullo STDIN la

Non sara’ lo STDOUT? :wink: stampare sull’input e’ un po’ difficile, non
solo in ruby :wink: