Programmazione.it v6.4
Ciao, per farti riconoscere devi fare il login. Non ti sei ancora iscritto? Che aspetti, registrati adesso!
Info Pubblicità Collabora Autori Sottoscrizioni Preferiti Bozze Scheda personale Privacy Archivio Libri Corsi per principianti Forum
Corso su Ruby: Duck Typing
Scritto da Satish Talim il 17-09-2007 ore 11:20
Intel Cluster Studio XE
Si è già detto che in Ruby non è necessario dichiarare i tipi di variabili e di metodi poiché ogni cosa è trattata come un oggetto. Gli oggetti Ruby, diversamente da quelli trattati dagli altri linguaggi di programmazione orientati agli oggetti, possono essere modificati individualmente. In Ruby, il comportamento o le capacità di un oggetto possono essere deviati da quelli inviati dalle sue classi e inoltre si dà più importanza alle capacità di un oggetto che al tipo o classe dello stesso.

Di conseguenza, Duck Typing indica che un oggetto è definito da cosa esso può fare, non da quello che rappresenta. Duck Typing si riferisce alla tendenza di Ruby di preoccuparsi meno delle classi di un oggetto che dei metodi che in esso si posono chiamare e quali operazioni possono essere realizzate in esso. In Ruby, potremmo usare respond_to o passare semplicemente un oggetto al metodo e sapere che sarà sollevata una eccezione se il metodo è usato impropriamente. Se un oggetto si muove come una papera e si esprime come una papera, l'interprete di Ruby lo tratterà come tale.

Si consideri l'esempio seguente:
  1. <span style="font-size:1.0em">
  2.  # controlla se un oggetto definisce il metodo to_str  
  3.  puts ('A string'.respond_to? :to_str) # => true  
  4. puts (Exception.new.respond_to? :to_str) # => true  
  5. puts (4.respond_to? :to_str) # => false  
  6. </span>
L'esempio appena visto è il più semplice della filosofia Ruby, conosciuta come Duck Typing: se un oggetto starnazza come ad una papera (o agisce come una stringa), allora la si consideri e la si tratti come una papera (o una stringa). Quando possibile, si possono trattare gli oggetti secondo i metodi che essi definiscono, piuttosto che le classi che essi ereditano o dai moduli che essi includono. Le eccezioni, per istanza, sono essenzialmente stringhe che hanno informazioni extra associate ad esse. Ecco un esempio (p036duck.rb) che considera tre classi, Duck, Goose e DuckRecording:
  1. <span style="font-size:1.0em">
  2.  class Duck  
  3.    def quack  
  4.      'Quack!'  
  5.    end     
  6.    def swim  
  7.      'Paddle paddle paddle...'  
  8.    end  
  9.  end     
  10.  class Goose  
  11.    def homk  
  12.      'Hock!'  
  13.    end  
  14.    def swim  
  15.      'Splash splash splash...'  
  16.    end  
  17.  end     
  18.  class DuckRecording  
  19.    def quack  
  20.      play  
  21.  end     
  22.    def play  
  23.      'Quack!'  
  24.    end  
  25.  end     
  26.  def make_it_quack(duck)  
  27.    duck.quack  
  28.  end  
  29.  puts make_it_quack(Duck.new)  
  30.  puts make_it_quack(DuckRecording.new)     
  31.  def make_it_swim(duck)  
  32.    duck.swim  
  33.  end  
  34.  puts make_it_swim(Duck.new)  
  35.  puts make_it_swim(Goose.new) </span>

Se ci si riferisce al codice sottostante:
  1. <span style="font-size:1.0em">
  2. def make_it_quack(duck)  
  3. duck.quack  
  4.  end  
  5. puts make_it_quack(Duck.new)  
  6. puts make_it_quack(DuckRecording.new)   </span>

Un metodo che dice a Duck di esprimersi, lavora quando viene dato un DuckRecoding, a seconda dell'input immesso. Ecco un esempio di metodo che dice a Duck di nuotare quando riceve la parola Goose:
  1. <span style="font-size:1.0em">
  2.  def make_it_swim(duck)  
  3. duck.swim  
  4. end  
  5. puts make_it_swim(Duck.new)  
  6. puts make_it_swim(Goose.new)   </span>

"Traduzione e adattamento a cura di Francesca Beatrice Cice. La versione originale del tutorial di Satish Talim può essere trovata su rubylearning.com"
Precedente: JavaFX Script, un tutorial proposto da Sun
Successiva: I VMWare Tools diventano open source
Copyright Programmazione.it™ 1999-2013. Alcuni diritti riservati. Testata giornalistica iscritta col n. 569 presso il Tribunale di Milano in data 14/10/2002. Pagina generata in 0.244 secondi.