# Chiamata per valore o per riferimento

**URL:** <https://www.ruby-forum.com/t/chiamata-per-valore-o-per-riferimento/171197>\
**Category:** IT\
**Created:** [June 28, 2009, 12:13pm UTC](https://www.ruby-forum.com/t/chiamata-per-valore-o-per-riferimento/171197 "2009-06-28T12:13:46Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![Gian\_luca\_C](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/e8c25b/32.png) [@Gian\_luca\_C](https://www.ruby-forum.com/u/Gian_luca_C)\
**Post date:** [June 28, 2009, 12:13pm UTC](https://www.ruby-forum.com/t/chiamata-per-valore-o-per-riferimento/171197/1 "2009-06-28T12:13:46Z")

</div>

Salve a tutti!

Sono nuovo di questo forum.  
Invio questo post in quanto mi interessava avere delle delucidazioni  
riguardo alla strategia di valutazione utilizzata da Ruby: chiamata per  
valore o per riferimento o una delle altre. Basta infatti vedere il link  
di wiki

> **[Evaluation strategy](https://en.wikipedia.org/wiki/Evaluation_strategy)**
>
> In a programming language, an evaluation strategy is a set of rules for evaluating expressions. The term is often used to refer to the more specific notion of a parameter-passing strategy that defines the kind of value that is passed to the function for each parameter (the binding strategy) and whether to evaluate the parameters of a function call, and if so in what order (the evaluation order). The notion of reduction strategy is distinct, although some authors conflate the two te To illustrate,...

in cui distingue fra stretegie di valutazione e all’interno di ciascuna  
specifica ulteriormente…

Grazie anticipatamente per la risposta.  
CIAO!

---

<div class="post-metadata">

**Author:** ![Gian\_luca\_C](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/e8c25b/32.png) [@Gian\_luca\_C](https://www.ruby-forum.com/u/Gian_luca_C)\
**Post date:** [July 1, 2009, 1:56pm UTC](https://www.ruby-forum.com/t/chiamata-per-valore-o-per-riferimento/171197/2 "2009-07-01T13:56:05Z")

</div>

Non sapevo che in alcuni casi si potesse modificare il valore, forse  
preferivo che non si potesse fare del tutto, per chiarezza. La cosa  
migliore sarebbe stata il poter scegliere come per esempio in php, non  
capisco i motivi di tale scelta. In ruby 1.9 ci sono cambiamenti su  
questo tema?

---

<div class="post-metadata">

**Author:** ![Gian\_luca\_C](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/e8c25b/32.png) [@Gian\_luca\_C](https://www.ruby-forum.com/u/Gian_luca_C)\
**Post date:** [June 28, 2009, 12:40pm UTC](https://www.ruby-forum.com/t/chiamata-per-valore-o-per-riferimento/171197/3 "2009-06-28T12:40:28Z")

</div>

> From: Gian luca Colotto [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
> To: removed\_email\_address@domain.invalid  
> Sent: Sunday, 28 June, 2009 12:13:46  
> Subject: [ruby-it] Chiamata per valore o per riferimento
> 
> Salve a tutti!

benvenuto

> Sono nuovo di questo forum.

io rispondo dal lato mailing list 🙂

> Grazie anticipatamente per la risposta.  
> in realtà non hai fatto una domanda… comunque nel link che proponi ruby  
> avrebbe una semantica “call by sharing”, o “passaggio per valore del  
> riferimento”. Esempio veloce che è più chiaro

> > def f(x) x \<\< 1 end  
> > =\> nil  
> > a=1  
> > =\> 1  
> > b=[]  
> > =\> []  
> > f(a)  
> > =\> 2  
> > a  
> > =\> 1  
> > f(b)  
> > =\> [1]  
> > b  
> > =\> [1]

vedi che gli oggetti passati per riferimento possono essere mutati, solo  
che alcuni tipi (eg i numeri) sono immutabili  
Allo stesso tempo, l’assegnazione all’interno dei metodi non influenza  
il chiamante:

> > def f(x) x+=x end #assegnazione  
> > =\> nil  
> > f(a)  
> > =\> 2 #x nel metodo è stato ri-assegnato  
> > f(b)  
> > =\> [1, 1] # anche qui  
> > a  
> > =\> 1 #ma non ci sono modifiche alle variabili esterne  
> > b  
> > =\> [1]

---

<div class="post-metadata">

**Author:** ![Gian\_luca\_C](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/e8c25b/32.png) [@Gian\_luca\_C](https://www.ruby-forum.com/u/Gian_luca_C)\
**Post date:** [July 3, 2009, 12:02am UTC](https://www.ruby-forum.com/t/chiamata-per-valore-o-per-riferimento/171197/4 "2009-07-03T00:02:46Z")

</div>

–  
blog it: [http://riffraff.blogsome.com](http://riffraff.blogsome.com)  
blog en: [http://www.riffraff.info](http://www.riffraff.info)

----- Original Message ----

> From: Marco M. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
> To: removed\_email\_address@domain.invalid  
> Sent: Wednesday, 1 July, 2009 13:56:05  
> Subject: Re: [ruby-it] Chiamata per valore o per riferimento
> 
> Non sapevo che in alcuni casi si potesse modificare il valore, forse  
> preferivo che non si potesse fare del tutto, per chiarezza. La cosa  
> migliore sarebbe stata il poter scegliere come per esempio in php, non  
> capisco i motivi di tale scelta.

non saprei, penso sia perché è la cosa che ha più senso in un contesto OO.  
Non si tratta molto di poter modificare il valore, ma del fatto che  
tutto si risolve  
nell’invio di messaggi a oggetti (ovvero la chiamata di metodi).

Il fatto che alcuni oggetti (IO, liste) rispondano a questi messaggi  
modificando  
lo stato, mentre altri (numeri, simboli) forniscono solo valori di  
ritorno è un dettaglio.  
In cambio hai un modello concettuale molto semplice: esistono solo  
oggetti e tutti sono passati per riferimento.

D’altronde, come cliente di una procedura che muta i parametri hai  
controllo comunque su questa cosa: basta passare una copia per evitare  
che quella che usi venga modificata (che generalmente è comunque una  
cattiva idea).  
Oppure, se vuoi, puoi rendere immutabile un oggetto mutabile usando  
#freeze.

> In ruby 1.9 ci sono cambiamenti su  
> questo tema?

non credo, l’idea è vecchia di 30 anni e abbastanza comprovata 🙂
