Chiamata per valore o per riferimento

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

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

Grazie anticipatamente per la risposta.
CIAO!

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?

From: Gian luca Colotto [email protected]
To: [email protected]
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 :slight_smile:

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]


blog it: http://riffraff.blogsome.com
blog en: http://www.riffraff.info

----- Original Message ----

From: Marco M. [email protected]
To: [email protected]
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 :slight_smile: