# Definire un metodo 'in place'

**URL:** <https://www.ruby-forum.com/t/definire-un-metodo-in-place/120987>\
**Category:** IT\
**Created:** [November 22, 2007, 12:53pm UTC](https://www.ruby-forum.com/t/definire-un-metodo-in-place/120987 "2007-11-22T12:53:55Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![bigme](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/c0e974/32.png) [@bigme](https://www.ruby-forum.com/u/bigme)\
**Post date:** [November 22, 2007, 12:53pm UTC](https://www.ruby-forum.com/t/definire-un-metodo-in-place/120987/1 "2007-11-22T12:53:55Z")

</div>

Ciao ragazzi,

dopo una giornata intera a cercare su internet non sono riuscito a  
capire se e` possibile definire un metodo che modifica i parametri  
ricevuti ‘in place’.

Faccio un esempio:

def funz! a  
a = “Pluto”  
end

a = “Pippo”  
funz! a  
print a #vorrei che stampasse Pluto

Grazie a tutti,  
FC

–  
Ing. Francesco C. ([http://www.fcioffi.net](http://www.fcioffi.net))  
Linux User id #340148 ([http://counter.li.org](http://counter.li.org))  
Debian GNU/Linux user ([http://www.debian.org](http://www.debian.org))  
Universita` del Sannio di Benevento ([http://www.grace.ing.unisannio.it](http://www.grace.ing.unisannio.it))  
SannioLUG ([http://www.sanniolug.org](http://www.sanniolug.org))

---

<div class="post-metadata">

**Author:** ![bigme](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/c0e974/32.png) [@bigme](https://www.ruby-forum.com/u/bigme)\
**Post date:** [November 22, 2007, 1:03pm UTC](https://www.ruby-forum.com/t/definire-un-metodo-in-place/120987/2 "2007-11-22T13:03:18Z")

</div>

In realtà credo che Ruby utilizzi esclusivamente il passaggio per  
valore e non per riferimento… Del resto è “logico” in un’ottica  
OO…

Il 22/11/07, Francesco C.[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) ha scritto:

---

<div class="post-metadata">

**Author:** ![bigme](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/c0e974/32.png) [@bigme](https://www.ruby-forum.com/u/bigme)\
**Post date:** [November 22, 2007, 1:07pm UTC](https://www.ruby-forum.com/t/definire-un-metodo-in-place/120987/3 "2007-11-22T13:07:25Z")

</div>

Mi veniva da pensare che lo si potesse fare in quanto fornisce metodi  
“Bang” per alcuni oggetti standard, ad esempio String.chomp!

L’importante è saperlo, poi si ovvia sfruttando la possibilità di  
ritornare piu` parametri.

FC

On Nov 22, 2007 1:02 PM, Carlo P. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> > capire se e` possibile definire un metodo che modifica i parametri  
> > print a #vorrei che stampasse Pluto  
> > SannioLUG ([http://www.sanniolug.org](http://www.sanniolug.org))
> 
> * * *
> 
> Ml mailing list  
> removed\_email\_address@domain.invalid  
> [http://lists.ruby-it.org/mailman/listinfo/ml](http://lists.ruby-it.org/mailman/listinfo/ml)

–  
Ing. Francesco C. ([http://www.fcioffi.net](http://www.fcioffi.net))  
Linux User id #340148 ([http://counter.li.org](http://counter.li.org))  
Debian GNU/Linux user ([http://www.debian.org](http://www.debian.org))  
Universita` del Sannio di Benevento ([http://www.grace.ing.unisannio.it](http://www.grace.ing.unisannio.it))  
SannioLUG ([http://www.sanniolug.org](http://www.sanniolug.org))

---

<div class="post-metadata">

**Author:** ![bigme](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/c0e974/32.png) [@bigme](https://www.ruby-forum.com/u/bigme)\
**Post date:** [November 22, 2007, 2:37pm UTC](https://www.ruby-forum.com/t/definire-un-metodo-in-place/120987/4 "2007-11-22T14:37:18Z")

</div>

— Carlo P. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> In realtà credo che Ruby utilizzi esclusivamente il  
> passaggio per  
> valore e non per riferimento… Del resto è “logico”  
> in un’ottica  
> OO…

il contrario, il passaggio è sempre per riferimento,  
ovvero l’oggetto non viene mai copiato, viene sempre  
passato un riferimento allo stesso.

E’ proprio per questo che se usi metodi che modificano  
l’oggetto come String#gsub! questo viene cambiato  
anche nell’ambito del chiamante.

Il problema per cui non è possibile fare:

def change(a)

# oggetto passato = 20

end

a= 10  
change(a)  
puts a # 20

è che all’interno del metodo #change puoi solo  
cambiare il “nome” ma non la “sostanza”[1]

Se ti serve un comportamento di questo tipo, che al  
99% è errato, di conviene costruire una tua classe  
Klass che mantiene in una variabile d’istanza il  
valore effettivo, e fornisce un metodo #update (o  
#set, o @value=) per cambiarlo.

[1] a meno di hack malvagi, ad esempio in evil.rb  
esiste un metodo Object#become(another), copiato da  
Smalltalk, che permette di trasformare un oggetto in  
un altro

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

```
  ___________________________________________________________

```

Want ideas for reducing your carbon footprint? Visit Yahoo! For Good  
[http://uk.promotions.yahoo.com/forgood/environment.html](http://uk.promotions.yahoo.com/forgood/environment.html)

---

<div class="post-metadata">

**Author:** ![bigme](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/c0e974/32.png) [@bigme](https://www.ruby-forum.com/u/bigme)\
**Post date:** [November 22, 2007, 1:13pm UTC](https://www.ruby-forum.com/t/definire-un-metodo-in-place/120987/5 "2007-11-22T13:13:54Z")

</div>

Aspetta aspetta…  
String.chomp! è un metodo che ti modifica l’_oggetto_ String che lo  
invoca, e non il parametro che gli passi (che tra l’altro serve a  
tutt’altro)

Il 22/11/07, Francesco C.[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) ha scritto:

---

<div class="post-metadata">

**Author:** ![bigme](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/c0e974/32.png) [@bigme](https://www.ruby-forum.com/u/bigme)\
**Post date:** [November 22, 2007, 2:45pm UTC](https://www.ruby-forum.com/t/definire-un-metodo-in-place/120987/6 "2007-11-22T14:45:02Z")

</div>

Il 22/11/07, gabriele renzi[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) ha scritto:

> il contrario, il passaggio è sempre per riferimento,  
> ovvero l’oggetto non viene mai copiato, viene sempre  
> passato un riferimento allo stesso.

Infatti!  
Chiedo scusa per la confusione: ruby NON copia l’oggetto passato come  
parametro…

---

<div class="post-metadata">

**Author:** ![bigme](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/c0e974/32.png) [@bigme](https://www.ruby-forum.com/u/bigme)\
**Post date:** [November 22, 2007, 2:37pm UTC](https://www.ruby-forum.com/t/definire-un-metodo-in-place/120987/7 "2007-11-22T14:37:18Z")

</div>

Ruby passa i parametri per valore. Non puoi cambiare l’identità  
dell’oggetto passato; però puoi invocare sull’oggetto passato dei metodi  
che  
ne modificano lo stato. Ad esempio:

> > def change(a); a[0] = “pluto”; end  
> > =\> nil
> 
> > x = [“pippo”]  
> > =\> [“pippo”]
> 
> > change x  
> > =\> “pluto”
> 
> > x  
> > =\> [“pluto”]
> 
> >

M
