Rigiro su questa lista una discussione filosofica tra me ed un’altro mio
amico rubysta salentino:
In ruby non e’ possibile effettuare un overloading sullo stile di C++ o
Java (etc.):
class Prova
def pippo(primo)
end
def pippo(primo,secondo)
end
end
Perche’? come si risolve?
La spiegazione che al momento sono riuscito a darmi e’ la seguente:
ruby e’ un linguaggio dinamicamente tipizzato, di conseguenza non
dichiariamo il tipo dei parametri;
un eventuale overloading dovrebbe quindi tenere conto soltanto del
numero dei parametri… questo
gia’ ne limita’ notevolmente l’utilita’.
Inoltre esistono i parametri di lunghezza variabile:
def pippo(*primo)
puts primo
end
pippo(“prova”)
pippo(“prova”,2)
Quindi a mio avviso la soluzione in ruby dovrebbe essere qualcosa del
tipo:
class Prova
def pippo(*ciccio)
case ciccio.length
when 1: pippo_1 ciccio[0]
when 2: pippo_2 ciccio[0], ciccio[1]
end
end
private
def pippo_1(ciccio)
puts ciccio
end
def pippo_2(ciccio1, ciccio2)
puts ciccio1
puts ciccio2
end
end
p = Prova.new
p.pippo(“prova”)
p.pippo(“pluto”,“ciccio”)
Potremmo addirittura pensare di metaprogrammare il concetto in qualcosa
del tipo:
class Prova
overload :pippo, :pippo_1, :par_length => ‘==1’
overload :pippo, :pippo_2, :par_length => ‘==2’
overload :pippo, :pippo_2, :par_length => ‘==2’, :par_types =>
Fixnum
def pippo_1(ciccio)
puts ciccio
end
def pippo_2(ciccio1, ciccio2)
puts ciccio1
puts ciccio2
end
def pippo_2int(ciccio1, ciccio2)
puts "la somma e' : #{ciccio1+ciccio2}
end
end
Cosa ne pensate?
Riguardo alle motivazioni e alle soluzioni alternative?
–
rpl