rubyacademy

 

Classes

Page history last edited by g 9 mos ago

Le classi

 

Prima abbiamo visto diversi generi, o classi, di oggetti: stringhe, interi, decimali, array e qualche oggetto speciale (true, false, and nil) che vedremo in seguito. In Ruby, queste classi iniziano sempre per lettera maiuscola: String, Integer, Float, Array... etc. In generale se si vuole creare un nuovo oggetto di una classe si usa new:

 

a = Array.new + [12345] # Somma di Array.

b = String.new + 'hello' # Somma di String.

c = Time.new

puts 'a = '+a.to_s

puts 'b = '+b.to_s

puts 'c = '+c.to_s

a = 12345

b = hello

c = Sat May 05 06:11:13 GMT 2007

 

Dato che gli array e le stringhe possono essere creati usando rispettivamente [...] e '...' , raramente useremo new per crearli. (Benché questo non sia evidente dall'esempio, String.new crea una stringa vuota, e Array.new crea un array vuoto.) Infine, i numeri rappresentano un'eccezione: non è possibile creare un intero con Integer.new. Bisogna scrivere l'intero direttamente.

 

La classe Time

 

Dunque che roba è la classe Time? Gli oggetti Time rappresentano momenti di tempo. E' possibile aggiungere (o sottrarre) numeri al (o dal) tempo per ottenere nuovi tempi: aggiungendo 1.5 si ha un nuovo tempo con un secondo e mezzo in più:

 

time = Time.new # Il momento attuale.

time2 = time + 60 # Un minuto dopo.

puts time

puts time2

Sat May 05 06:11:13 GMT 2007

Sat May 05 06:12:13 GMT 2007

 

E' possibile anche creare un tempo che rappresenta uno specifico momento usando Time.mktime:

 

puts Time.mktime(2000, 1, 1) # L'anno duemila.

puts Time.mktime(1976, 8, 3, 10, 11) # Quando sono nato.

Sat Jan 01 00:00:00 GMT 2000

Tue Aug 03 10:11:00 GMT 1976

 

Nota: questa è la mia data di nascita in Pacific Daylight Savings Time (PDT). Quando il duemila è arrivato era Pacific Standard Time (PST), almeno per noi della West Coast. Le parentesi raggruppano i parametri di mktime. Più parametri vengono aggiunti, più accurato sarà il tempo. Provate!

 

Si possono confrontare i tempi usando il metodo di confronto (un tempo precedente è minore di un tempo successivo), e se si sottraggono due tempi si ottiene la loro differenza in secondi. Giocateci un po'!

 

 

Alcune cose da provare

  • Un miliardo di secondi... calcolate l'esatto numero di secondi trascorsi dalla vostra nascita (se potete). Calcolate quando compirete (o forse quando avete compiuto?) un miliardo di secondi. Quindi segnatelo sul vostro calendario.
  • Buon compleanno! Chiedete ad una persona in che anno, mese e giorno è nata. Calcolate quanti anni ha e dategli un bel ceffone per ogni compleanno.

 

 

La classe Hash

Un'altra utile classe è Hash. Un hash è una specie di array: ha un mucchio di posti che possono puntare a diversi oggetti. Negli array i posti sono allineati in una riga e sono tutti numerati (partendo da zero). In un hash i posti non sono allineati (sono ammucchiati tutti insieme), ed è possibile usare qualsiasi oggetto per fare riferimento ad essi. E' una buona idea uare gli hash quando si vuole tenere traccia di un sacco di cose che non non si adattano bene a stare in una lista ordinata. Ad esempio i colori utilizzati per le diverse parti del codice in questo documento:

 

colorArray = [] # Lo stesso di Array.new

colorHash = {} # Lo stesso di Hash.new

colorArray0 = 'rosso'

colorArray1 = 'verde'

colorArray2 = 'blu'

colorHash'stringhe' = 'rosso'

colorHash'numeri' = 'verde'

colorHash'keyword' = 'blu'

colorArray.each do color

puts color

end

colorHash.each do codeType, color

puts codeType + ': ' + color

end

rosso

verde

blu

stringhe: rosso

keyword: blu

numeri: verde

 

Se si usa un array, bisogna ricordarsi che la posizione 0 rappresenta le stringhe, la 1 i numeri, etc. Se si usa un hash invece è tutto molto semplice! Il posto 'stringhe' conterrà ovviamente il colore delle stringhe. Niente da ricordare. Avrete sicuramente notato che quando si usa each, gli oggetti dell'hash non vengono fuori nello stesso ordine d'inserimento. (Almeno non è successo quando l'ho scritto. Ma potrebbero esserlo ora... con gli hash non si sa mai.) Per tenere le cose in ordine vanno usati gli array, non gli hash.

 

Sebbene le persone usino delle stringhe per identificare le posizioni negli hash, si può anche usare qualsiasi tipo di oggetti, anche array o altri hash (sebbene non mi venga in mente nessun buon motivo per farlo...):

 

weirdHash = Hash.new

weirdHash12 = 'monkeys'

weirdHash[] = 'emptiness'

weirdHash[Time.new] = 'no time like the present'

 

Hash e array vanno utilizzati per cose differenti; spetta a voi decidere quale scelta è la migliore per il particolare problema.

 

Estendere le classi

Alla fine dell'ultimo capitolo, avete scritto un metodo per ottenete la parola corrispondente ad un numero intero. Non era un metodo per gli interi; era solo un metodo generico. Non sarebbe bello poter scrivere qualcosa tipo 22.to_eng invece di englishNumber 22? Ecco come farlo:

 

class Integer

def to_eng

if self == 5

english = 'five'

else

english = 'fifty-eight'

end

english

end

end

# Testiamolo su una coppia di numeri...

puts 5.to_eng

puts 58.to_eng

five

fifty-eight

 

Bene, l'abbiamo provato; sembra funzionare. ;)

 

Abbiamo definito un metodo per i numeri interi saltando per un momento nella classe Integer. Ora tutti gli interi hanno questo (un po' incompleto) metodo. In realtà, se ad esempio non ci piacesse il funzionamento del metodo to_s potremmo anche pensare di ridefinirlo in qualche altro modo... ma non è una buona idea! E' meglio lasciare i vecchi metodi in pace e farne di nuovi quando si deve fare qualcosa di nuovo.

 

Ancora confusi? Approfondiamo un po' l'ultimo programma. Finora l'esecuzione di qualsiasi codice o metodo definito è avvenuta nell'oggetto di default "programma". Nel nostro ultimo programma abbiamo abbandonato quell'oggetto per la prima volta e ci siamo messi nella classe Integer. Abbiamo definito un metodo (questo lo rende un metodo per numeri interi) e tutti gli interi possono usarlo. All'interno del metodo si usa self per fare riferimento all'oggetto (l'intero) che sta usando il metodo.

 

 

Creare le classi

Abbiamo visto un gran numero di diverse classe di oggetti. Comunque è semplice arrivare a tipi di oggetti che Ruby non ha. Fortunatamente creare nuove classi è semplice come modificare quelle già esistenti. Diciamo di voler creare dei dadi in Ruby. Ecco come si potrebbe rendere la classe Dado:

 

class Dado

def rotola

1 + rand(6)

end

end

# Creiamo una coppia di dadi...

dadi = [Dado.new, Dado.new]

# ...e tiriamoli.

dadi.each do dado

puts dado.rotola

end

2

1

 

(Se avete saltato la sezione sui numeri casuali, rand(6) restituisce un numero casuale compreso tra 0 e 5.)

 

E il gioco è fatto! I nostri oggetti. Tiriamo i dadi alcune volte (con il tasto reload del browser) e vediamo cosa viene fuori.

 

Si posono definire tutti i tipi di metodi per i nostri oggetti... ma manca ancora qualcosa.

 

 

...continua...

Comments (0)

You don't have permission to comment on this page.