Esempio superclasse

buongiorno a tutti,
sono un principiante, da poco ho cominciato a studiare questo fantastico
linguaggio di programmazione.

ho preso spunto dalla guida di ruby-doc.org, per provare un esempio di
oggetto creato da una classe ereditata da superclasse che vedete qui
sotto, però mi restituisce un errore: troppi argomenti -wrong number of
arguments (4 for 3)

sapreste indicarmi dove sto sbagliando?

vorrei poi sapere come inserire il codice al’ interno dei messaggi (sono
disponibili dei tag specifici per delimitarlo?) mi sembra che il forum
sia un po carente di queste funzioni.

un ringraziamento anticipato a chi mi riponderÃ

#startcode
class Song
def initialize(name, artist, duration)
@name = name
@artist = artist
@duration = duration
puts “new song created: #{@name} - #{@artist} (#{@duration}
seconds)”
end
end

class KaraokeSong < Song
def initialize(name, artist, duration, lyrics)
super(name, artist, duration)
@lyrics = lyrics
puts super+“#{@lyrics}”
end
end

aSong = KaraokeSong.new(“My Way”, “Sinatra”, 225, “And now, the…”)
#end code

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Aldo I. wrote:

ho preso spunto dalla guida di ruby-doc.org, per provare un esempio di
oggetto creato da una classe ereditata da superclasse che vedete qui
sotto, però mi restituisce un errore: troppi argomenti -wrong number of
arguments (4 for 3)

Ciao Aldo,

quando chiami super senza argomenti all’interno dell’initialize della
classe KaraokeSong, stai implicitamente passando i suoi 4 argomenti
all’inizialize della superclasse, che però ne richiede solo 3. Per cui
Ruby ti mostra l’errore wrong number of arguments (4 for 3).

Dovresti passare esplicitamente i primi 3 parametri ma per come hai
strutturato il codice, avrai comunque problemi perché otteresti un
errore del tipo: NoMethodError: undefined method `+’ for nil:NilClass

In questo caso l’errore è dovuto al fatto che stai cercando di
concatenare il valore di ritorno di super con la stringa " #{@lyrics}".
Questo non è possibile perché il metodo initialize della supercalsse
ritorna il valore nil (che è il valore di default di una chiamata al
metodo puts).

Visto che sei agli inizi, direi che utilizzare un secondo metodo che
ritorna la stringa desiderata, è forse il modo più semplice per venirne
fuori.

Ciao,
Antonio


http://antoniocangiano.com - Zen and the Art of Programming
http://stacktrace.it | http://math-blog.com
http://twitter.com/acangiano | Tony Cangiano | Flickr
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.8 (Darwin)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iEYEARECAAYFAkgZo3QACgkQqCqsu0qUj9TtsACfQJehmDT9ETQYWWRGCON+683r
kyMAoLa/NdERZ36KBvLarAYJ0nQt4X/j
=OAm6
-----END PGP SIGNATURE-----

grazie per la risposta esauriente.
ho modificato il codice come vedi sotto e cosi funziona.
però non ho ancora capito bene per quale motivo come avevo scritto
prima il “super” passa anche i 4 argomenti…

la forma che vedi qui sotto l’ ho imparata da questo libro
http://www.apogeonline.com/libri/88-503-2510-X/scheda
però volevo spingermi oltre a quell’ esempio un po banale che ho
riportato, mi sapresti indicare dove posso reperire degli esempi più
avanzati?

ciao

#start code -----------------------
class Song
def initialize(name, artist, duration)
@name = name
@artist = artist
@duration = duration
end
def inspect
"name:#{@name} artist:#{@artist} duration:#{@duration} "
end
end

class KaraokeSong < Song
def initialize(name, artist, duration, lyrics)
super(name, artist, duration)
@lyrics = lyrics
end
def inspect
super + " lyrics:#{@lyrics}"
end
end
#end code -----------------------

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Aldo I. wrote:

grazie per la risposta esauriente.
ho modificato il codice come vedi sotto e cosi funziona.
però non ho ancora capito bene per quale motivo come avevo scritto
prima il “super” passa anche i 4 argomenti…

Quando usi super senza argomenti, Ruby ignora temporaneamente il metodo
definito nella classe corrente e riesegue la chiamata, invocando di
fatto il metodo della superclasse e passandogli tutti gli argomenti
ricevuti. Per cui KaraokeSong.new(a, b, c, d) invocherà initialize(a, b,
c, d) della classe Song, che però si aspetta solo 3 parametri, per cui
Ruby solleverà un’eccezione. Se hai bisogno di passare solo 3 parametri,
puoi farlo specificandoli: super(a, b, c).

la forma che vedi qui sotto l’ ho imparata da questo libro
http://www.apogeonline.com/libri/88-503-2510-X/scheda
però volevo spingermi oltre a quell’ esempio un po banale che ho
riportato, mi sapresti indicare dove posso reperire degli esempi più
avanzati?

Se vuoi iniziare a fare sul serio, ci sono tre libri che ti consiglio
vivamente:

  1. The Ruby Way, 2nd edition
  2. Design Patterns in Ruby
  3. Ruby Cookbook

Ma cerca di crearti solide basi prima, studiando bene il libro che hai.

Ciao,
Antonio


http://antoniocangiano.com - Zen and the Art of Programming
http://stacktrace.it | http://math-blog.com
http://twitter.com/acangiano | Tony Cangiano | Flickr
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.8 (Darwin)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iEYEARECAAYFAkgbDRAACgkQqCqsu0qUj9Q9FQCeI0QeRZjalBMDLghglpSq8DQ3
Zf0Anjg5X+epDUpMd96DSH29ajhmRjfe
=fJx/
-----END PGP SIGNATURE-----

Se vuoi iniziare a fare sul serio, ci sono tre libri che ti consiglio
vivamente:

  1. The Ruby Way, 2nd edition
  2. Design Patterns in Ruby
  3. Ruby Cookbook

grazie per i preziosi consigli, ho iniziato a dare una sbirciata a Ruby
Cookbook su books.google.it e vedo che è ricco di contenuti
però prima di fare il passo più lungo della gamba è meglio che finisca
con l’ altro libro, sperando che poi sia tutto chiaro :slight_smile:
a presto

io ho letto il libro e posso dirti che come introduzione a ruby è ben
strutturato, anche se IMHO gli ultimi capitoli non sono ben
congegnati come i primi, pero è un ottimo volume.

Luca

ps: tra l’altro alcuni degli autori-collabotari alla stesura sono
presenti in lista è puoi chiedere direttamente a loro, perché sempre
molto disponibili.

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

luca sabato wrote:
| ps: tra l’altro alcuni degli autori-collabotari alla stesura sono
| presenti in lista è puoi chiedere direttamente a loro, perché sempre
| molto disponibili.

LOL. Sì, in effetti uno di quelli sarei io. :slight_smile:


http://antoniocangiano.com - Zen and the Art of Programming
http://stacktrace.it | http://math-blog.com
http://twitter.com/acangiano | Tony Cangiano | Flickr
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (MingW32)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iEYEARECAAYFAkgbRAoACgkQqCqsu0qUj9SYUQCgtuov6zmf1OWZoNTPptDu1znC
jJAAoKdHDvQjc6hQ8bP79x4upV0LODPJ
=cMTI
-----END PGP SIGNATURE-----