PDA

Visualizza la versione completa : Sovraccarico di metodo


Sgurbat
29-11-2008, 15:48
Ciao a tutti,

stavo provando un semplice script di esempio e mi rimane un dubbio.

Seguendo una guida ho creato questo semplice blocco di codice:



class Camion

def initialize(posti,carburante)
@posti = posti
@carburante = carburante
end

def posti
return @posti
end

def posti(nuovi_posti)
@posti = nuovi_posti
end

end

c = Camion.new(30,100)
puts c.posti


Convinto che i due metodi "posti" non conflittassero per la diversa "firma".

Ed invece eseguendo il file mi ritrovo un messaggio di errore:
"...`posti': wrong number of arguments (0 for 1) (ArgumentError)"

Questo perchè, molto probabilmente, la chiamata a c.posti si aspetta il secondo metodo e non il primo.

Ovviamente se cambio nome al secondo metodo si sistema tutto ma vorrei capire il perchè dell'errore.

Grazie in anticipo.

weppos
03-12-2008, 10:05
Ruby non supporta l'overloading dei metodi.
http://ruby.html.it/faq/leggi/1229/ruby-supporta-loverloading-dei-metodi/

Esistono cmq dei workaround.



def posti(*args)
if args.length == 1
@posti = args.first
else
return @posti
end
end


In realtà, per esperienza, ti assicuro che sentirai molto poco questa mancanza.
Normalmente questo problema accade solo quando si tenta di ragionare in Ruby pensando ad un altro linguaggio.
Per sviluppare con Ruby devi poco per volta imparare a ragionare in Ruby.

Quello che tu vuoi fare è equivalente a



def posti
@posti
end

def posti=(nuovi_posti)
@posti = nuovi_posti
end


che si traduce semplicemente in



attr_accessor :posti


In altre parole, tutta la tua classe diventa



class Camion

def initialize(posti, carburante)
@posti = posti # meglio usare self.posti = posti
@carburante = carburante
end

end

c = Camion.new(30,100)
puts c.posti

Loading