Definire un metodo 'in place'

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)
Linux User id #340148 (http://counter.li.org)
Debian GNU/Linux user (http://www.debian.org)
Universita` del Sannio di Benevento (http://www.grace.ing.unisannio.it)
SannioLUG (http://www.sanniolug.org)

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.[email protected] ha scritto:

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. [email protected] wrote:

capire se e` possibile definire un metodo che modifica i parametri
print a #vorrei che stampasse Pluto
SannioLUG (http://www.sanniolug.org)


Ml mailing list
[email protected]
http://lists.ruby-it.org/mailman/listinfo/ml


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

— Carlo P. [email protected] 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
blog it: http://riffraff.blogsome.com
blog en: http://www.riffraff.info

  ___________________________________________________________

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

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.[email protected] ha scritto:

Il 22/11/07, gabriele renzi[email protected] 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…

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