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.