Il metodo
new è usato per creare un oggetto della classe
Dog. Gli oggetti sono creati nell'
Heap; la variabile
d è detta variabile di riferimento. Essa non contiene l'oggetto stesso, ma qualcosa simile ad un puntatore o ad un indirizzo dell'oggetto. Si usa l'operatore punto, su una varibile di riferimento per dire: "usa ciò che si trova a sinistra del punto per darmi ciò che si trova a destra del punto", per esempio
d.bark.
In
Rails, se si scrivono applicazioni nelle quali uno dei modelli di entità è, diciamo,
Customer, allora quando si scrive il codice che attiva il processo — un utente che si logga in un sito, l'aggiornamento di un numero di telefono di un utente, l'aggiunta di un prodotto in un carrello della spesa — con tutta probabilità si tratta di mandare messaggi agli oggetti di classe
Customer.
Anche un oggetto appena creato non è un foglio bianco; non appena un oggetto viene creato, è in grado di rispondere ad un certo numero di messaggi; ogni oggetto
nasce con alcune abilità. Per vedere una lista dei metodi innati, è possibile chiamare il metodo
methods e aggiungere la chiamata
sort, per rendere più facile la visualizzazione:
puts d.methods.sort.
Il riultato è la lista di tutti i messaggi (metodi) che l'oggetto appena generato ha con sé. Tra i tanti metodi, i metodi
object e
respond_to? sono importanti. Tutti gli oggetti in
Ruby hanno un numero ID unico associato, che è possibile ottenere chiedendo all'oggetto di mostrare il proprio ID:
<span style="font-size:1.0em">puts "The id of obj is #{d.object_id}."</span>
È possibile predeterminare, prima di chiedere all'oggetto di fare qualcosa, se l'oggetto è in grado di gestire il messaggio che si sta inviando, utilizzando il metodo
respond_to?. Questo metodo esiste per tutti gli oggetti; si può chiedere a qualsiasi oggetto se risponderà ad un dato messaggio.
respond_to? viene normalmente utilizzato in congiunzione con logica condizionale
if.
<span style="font-size:1.0em">
if d.respond_to?("talk") d.talk
else
puts "Sorry, the object doesn't understand the 'talk' message."
end </span>
Le istruzioni:
d1 = d
d1.display
fanno puntare
d e
d1 allo stesso oggetto. Questo sta ad indicare che è possibile usare notazioni speciali, al posto di una chiamata al metodo
new, per creare un nuovo oggetto in una classe. Le classi con costruttori letterali sono mostrate nella tabella sottostante:
<center>

</center>
Il comando
d=nil crea una
reference di
d a
nil, anche se non referenzia nulla. Se successivamente
d1=nil allora l'oggetto
Dog è abbandonato e può essere trattato dal
Garbage Collector (GC). L’
heap degli oggetti
Ruby alloca un minimo di 8 MB. Il GC di
Ruby viene chiamato
mark-and-sweep (segna-e-spazza). Lo stage
mark verifica gli oggetti per vedere se sono ancora in uso; se un oggetto è in una variabile che può essere ancora usata nello
scope corrente, l'oggetto — e ciascun oggetto contenuto nell'oggetto stesso — viene marcato per essere mantenuto. Se la variabile è scaduta da tempo, non usata in altri metodi, l'oggetto non è marcato. Lo stage
sweep quindi libera gli oggetti che non sono stati marcati.
Ruby utilizza un meccanismo conservativo
mark-and-sweep per il GC. Non ci sono garanzie che un oggetto sia sottoposto a GC prima che il programma termini. Se si riempie un array con qualcosa e si continua a maneggiarlo, esso è tutto contrassegnato. Se si inserisce un valore in una costante o una variabile globale viene segnato per sempre.
L'idea di un metodo di classe è che si manda un messaggio all'oggetto classe piuttosto che ad una delle istanze della classe. I metodi della classe realizzano questo scopo; alcune oerazioni pertinenti alla classe non possono essere realizzate da specifiche istanze di quella classe. Il metodo
new è un esempio eccellente: chiamiamo
Dog.new perché, fino a quando non abbiamo creato un’istanza individuale di
dog non possiamo inviargli nessun messaggio. D'altro canto, il lavoro di generare un nuovo oggetto appartiene per logica alla classe.
Non avrebbe senso che le istanze di
Dog si riproducano tra di loro. Ha senso, invece, che il processo di creazione dell'istanza sia centralizzato come attività della classe
Dog; è vitale comprendere che con
Dog.new abbiamo un metodo cui possiamo accedere attraverso la classe
Dog e non attraverso le sue istanze. I singoli oggetti
dog, istanze della classe
Dog , non hanno questo metodo. Un oggetto di classe ha i suoi propri metodi, il suo proprio stato, la propria identità, e non li condivide con le istanze di se stesso.
La tabella seguente mostra un esempio, preso in prestito dal libro
Ruby for Rails, circa la notazione usata:
<center>

</center>
"Traduzione e adattamento a cura di Francesca Beatrice Cice. La versione originale del tutorial di
Satish Talim può essere trovata su
rubylearning.com"