Ruby – classi e oggetti I

r2

Oggi comincio con un argomento lungo, e un po’ più impegnativo del solito, avete presente “quando il gioco si fa duro…” (cit.).
Ma, dai! non è difficile, vedrete.
Cominciamo con definire il concetto di classe. Una classe è un’unione di variabili e funzioni raccolte sotto un nome comune.
Vediamone subito un esempio, la classe Quadrato.
Comincio con creare una classe vuota, così:

class Quadrato
end

La parola class indica che stiamo definendo una classe il cui nome è Quadrato. Notare che in Ruby il nome della classe deve iniziare con una maiuscola.

Il quadrato ha quattro lati tutti della stessa lunghezza, mettiamo nella classe la lunghezza del lato, chiamiamola lung_lato, così:

class Quadrato
    attr_accessor :lung_lato
end

Qui attr_accessor è un accessorio per accedere a lung_lato. Possiamo adesso usare la nostra classe, creando un’istanza, così:

#!/usr/bin/ruby
# quadrato.rb

class Quadrato
    attr_accessor :lung_lato
end

q1 = Quadrato.new # crea un quadrato
q1.lung_lato = 5 # definisce la lunghezza di q1

puts "Il lato del quadrato q1 vale #{q1.lung_lato}"

quadrato

Allora: con Quadrato.new abbiamo definito un nuovo quadrato, chiamato q1, gli abbiamo definito la misura del lato utilizzando l’attributo lung_lato. Abbiamo poi chiesto la misura del lato, sempre con lo stesso attributo, sì può essere usato per settare che per accedere al valore in esso memorizzato (set e get nel gergo dei programmatori).

Nella classe quadrato adesso abbiamo una variabile (lung_lato) ma possiamo definire anche funzioni, per esempio area e perimetro, così:


class Quadrato
    attr_accessor :lung_lato

    def area
        @lung_lato * @lung_lato
    end

    def perimetro
        4 * @lung_lato
    end       
end

Le funzioni area e perimetro sono simili a quelle che abbiamo già visto nei post precedenti. Sono però contenute all’interno della classe, vediamo un esempio d’uso:

#!/usr/bin/ruby
# quad1.rb

class Quadrato
    attr_accessor :lung_lato

    def area
        @lung_lato * @lung_lato
    end

    def perimetro
        4 * @lung_lato
    end
end

q1 = Quadrato.new # crea un quadrato
q1.lung_lato = 5 # definisce la lunghezza di q1

puts "Lato = #{q1.lung_lato}"
puts "Area = #{q1.area}"
puts "Perimetro = #{q1.perimetro}"

quad1
OK, l’unica cosa nuova è l’uso dell’attributo accessorio lung_lato: per dire che vogliamo usare quello all’interno della classe dobbiamo prefissatlo con @. Questo lo identifica come una variabile della classe.

Inizializzatori e costruttori

Quando scriviamo q = Quadrato.new un nuovo quadrato viene creato. È possibile precisare all’atto della creazione alcune caratteristiche, anzi tutte quelle che vogliamo, ecco come:

#!/usr/bin/ruby
# quad2.rb

class Quadrato
    attr_accessor :lung_lato

    def initialize lung_lato = 0
        @lung_lato = lung_lato
    end

    def area
        @lung_lato * @lung_lato
    end

    def perimetro
        4 * @lung_lato
    end
end

q4 = Quadrato.new 4

q5 = Quadrato.new
q5.lung_lato = 5

puts "Lato = #{q4.lung_lato}"
puts "Area = #{q4.area}"
puts "Perimetro = #{q4.perimetro}"
puts ""
puts "Lato = #{q5.lung_lato}"
puts "Area = #{q5.area}"
puts "Perimetro = #{q5.perimetro}"

quad2

Notare la funzione initialize, righe 7-9, che ci permette di definire lung_lato durante la creazione. Questa funzione ha un valore di default, 0 nel nostro caso.

Possiamo così creare q4 passandogli subito la lunghezza del lato, riga 20.
In alternativa possiamo creare q5, riga 22 e definire dopo la lunghezza del lato, riga 23.

OK, per oggi basta così 😉 😀

Posta un commento o usa questo indirizzo per il trackback.

Commenti

  • bakerstreetboy  Il 14 luglio 2013 alle 15:41

    Mi spiace, stavolta ho capito molto poco ma anche perché mi mancano delle lezioni.
    Rimedierò.

    Ti prego, continua ad andare avanti nonostante i miei sbalzi di umore, ti seguo.

  • juhan  Il 14 luglio 2013 alle 15:43

    OK, segui le lezioni con ordine, c’è anche l’indice, e vedi che è semplicissimo 😀
    Sto capendo tutto anch’io 😉

  • bakerstreetboy  Il 14 luglio 2013 alle 15:45

    Cioè, a dir la verità, qualcosa ho capito, ma ad essere sincero non saprei rifarlo, riprodurlo.
    Quindi per il momento passo.

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.

%d blogger hanno fatto clic su Mi Piace per questo: