Il rubino viene interpretato. Le variabili sono riferimenti ai dati, ma non ai dati stessi. Ciò facilita l'utilizzo della stessa variabile per dati di tipi diversi.
L'assegnazione di lhs = rhs quindi copia il riferimento su rhs, non sui dati. Ciò differisce in altre lingue, come ad esempio C, in cui il compito esegue una copia dei dati in lhs da rhs.
Quindi per la chiamata di funzione, la variabile passata, diciamo x, viene effettivamente copiata in una variabile locale nella funzione, ma x è un riferimento. Ci saranno quindi due copie del riferimento, entrambe riferite agli stessi dati. Uno sarà nel chiamante, uno nella funzione.
L'assegnazione nella funzione copia quindi un nuovo riferimento alla versione di x della funzione. Dopo questo la versione di x del chiamante rimane invariata. È ancora un riferimento ai dati originali.
Al contrario, usando il metodo .replace su x, Ruby eseguirà una copia dei dati. Se la sostituzione viene utilizzata prima di qualsiasi nuova assegnazione, in effetti il chiamante vedrà anche i dati cambiare nella sua versione.
Allo stesso modo, fintanto che il riferimento originale è intatto per la variabile passata, le variabili dell'istanza saranno le stesse che vede il chiamante. All'interno della struttura di un oggetto, le variabili di istanza hanno sempre i valori di riferimento più aggiornati, indipendentemente dal fatto che siano forniti dal chiamante o impostati nella funzione a cui è stata passata la classe.
'Call by value' o 'call by reference' è confuso qui a causa della confusione su '=' Nelle lingue compilate '=' è una copia dei dati. Qui in questa lingua interpretata '=' è una copia di riferimento. Nell'esempio hai il riferimento passato seguito da una copia di riferimento attraverso '=' che blocca l'originale passato come riferimento, e quindi le persone che ne parlano come se '=' fossero una copia di dati.
Per essere coerenti con le definizioni, dobbiamo mantenere ".replace" in quanto è una copia di dati. Dal punto di vista di ".replace" vediamo che questo è davvero un riferimento. Inoltre, se esaminiamo il debugger, vediamo i riferimenti passare, poiché le variabili sono riferimenti.
Tuttavia, se dobbiamo mantenere '=' come frame di riferimento, in effetti possiamo vedere i dati passati fino a un compito, e quindi non possiamo più vederli dopo il compito, mentre i dati del chiamante rimangono invariati. A livello comportamentale, questo valore viene trasmesso per valore purché non consideriamo il valore trasferito come composito, poiché non saremo in grado di mantenerne una parte modificando l'altra parte in un singolo compito (poiché tale compito cambia il riferimento e l'originale esce dal campo di applicazione). Ci sarà anche una verruca, in tal caso le variabili negli oggetti saranno riferimenti, così come tutte le variabili. Quindi saremo costretti a parlare del passaggio di "riferimenti per valore" e dovremo usare locuzioni correlate.