Ruby Forum Italian Ruby user group > esempio superclasse

Posted by Aldo Italo (aldoitalo)
on 01.05.2008 12:30
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
Posted by Antonio Cangiano (Guest)
on 01.05.2008 13:03
(Received via mailing list)
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Aldo Italo 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 | http://flickr.com/acangiano
-----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-----
Posted by Aldo Italo (aldoitalo)
on 02.05.2008 12:12
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 -----------------------
Posted by Antonio Cangiano (Guest)
on 02.05.2008 14:46
(Received via mailing list)
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Aldo Italo 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 | http://flickr.com/acangiano
-----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-----
Posted by Aldo Italo (aldoitalo)
on 02.05.2008 14:57
> 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 :-)
a presto
Posted by luca sabato (Guest)
on 02.05.2008 18:35
(Received via mailing list)
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.
Posted by Antonio Cangiano (Guest)
on 02.05.2008 18:45
(Received via mailing list)
-----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. :)
- --
http://antoniocangiano.com   - Zen and the Art of Programming
http://stacktrace.it         | http://math-blog.com
http://twitter.com/acangiano | http://flickr.com/acangiano
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (MingW32)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

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