# Precedenze di stampa

**URL:** <https://www.ruby-forum.com/t/precedenze-di-stampa/188504>\
**Category:** IT\
**Created:** [May 13, 2010, 1:26am UTC](https://www.ruby-forum.com/t/precedenze-di-stampa/188504 "2010-05-13T01:26:16Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![Samuele\_M](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/77aa72/32.png) [@Samuele\_M](https://www.ruby-forum.com/u/Samuele_M)\
**Post date:** [May 13, 2010, 1:26am UTC](https://www.ruby-forum.com/t/precedenze-di-stampa/188504/1 "2010-05-13T01:26:16Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Samuele\_M](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/77aa72/32.png) [@Samuele\_M](https://www.ruby-forum.com/u/Samuele_M)\
**Post date:** [May 13, 2010, 1:29am UTC](https://www.ruby-forum.com/t/precedenze-di-stampa/188504/2 "2010-05-13T01:29:47Z")

</div>

2010/5/12 Samuele M. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

> end
> 
> cane = Cane.new
> 
> (1..3).each do |x|  
> puts "#{x} #{cane.abbaia} "  
> end

## Rimuovi il puts da abbaia.

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

---

<div class="post-metadata">

**Author:** ![Samuele\_M](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/77aa72/32.png) [@Samuele\_M](https://www.ruby-forum.com/u/Samuele_M)\
**Post date:** [May 13, 2010, 9:20am UTC](https://www.ruby-forum.com/t/precedenze-di-stampa/188504/3 "2010-05-13T09:20:58Z")

</div>

Il giorno 13 maggio 2010 01.25, Samuele M.  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)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 😃

ciao,  
Andrea

---

<div class="post-metadata">

**Author:** ![Samuele\_M](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/77aa72/32.png) [@Samuele\_M](https://www.ruby-forum.com/u/Samuele_M)\
**Post date:** [May 13, 2010, 11:47am UTC](https://www.ruby-forum.com/t/precedenze-di-stampa/188504/4 "2010-05-13T11:47:52Z")

</div>

Il giorno 13 maggio 2010 10.58, Luca De Marinis [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) ha  
scritto:

> 2010/5/13 Gendag [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):
> 
> > 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? 😉 stampare sull’input e’ un po’ difficile, non  
> solo in ruby 😉

Già, lapsus mio 😃  
Andrea

---

<div class="post-metadata">

**Author:** ![Samuele\_M](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/77aa72/32.png) [@Samuele\_M](https://www.ruby-forum.com/u/Samuele_M)\
**Post date:** [May 13, 2010, 10:59am UTC](https://www.ruby-forum.com/t/precedenze-di-stampa/188504/5 "2010-05-13T10:59:17Z")

</div>

2010/5/13 Gendag [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> 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? 😉 stampare sull’input e’ un po’ difficile, non  
solo in ruby 😉
