Visualizzazione dei risultati da 1 a 2 su 2

Discussione: Sovraccarico di metodo

  1. #1
    Utente di HTML.it L'avatar di deleted_id_48586
    Registrato dal
    Nov 2002
    Messaggi
    1,732

    Sovraccarico di metodo

    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:

    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.

  2. #2
    Ruby non supporta l'overloading dei metodi.
    http://ruby.html.it/faq/leggi/1229/r...ng-dei-metodi/

    Esistono cmq dei workaround.

    codice:
    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

    codice:
    def posti
      @posti
    end
    
    def posti=(nuovi_posti)
      @posti = nuovi_posti
    end
    che si traduce semplicemente in

    codice:
    attr_accessor :posti
    In altre parole, tutta la tua classe diventa

    codice:
    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

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.