Ruby è una delle lingue più popolari utilizzate sul web. Di recente abbiamo avviato una nuova serie di screencast su Nettuts + che ti introdurrà a Ruby, oltre ai grandi framework e strumenti che accompagnano lo sviluppo di Ruby. In questo capitolo, daremo un'occhiata alla creazione delle nostre classi Ruby.
Nel secondo capitolo, abbiamo imparato come aggiungere metodi a un oggetto già esistente. Se vogliamo iniziare con un oggetto vuoto che possiamo quindi aumentare con metodi e proprietà, possiamo semplicemente creare un'istanza di Oggetto
classe.
o = Object.new def o.my_method 1 + 1 end o.my_method # => 2
Che mi dici delle proprietà? Bene, Ruby ha variabili di istanza (variabili che ogni istanza di un oggetto ottiene); una variabile di istanza inizia con un segno 'at' (@
). È possibile ottenere e impostare queste variabili di istanza creando funzioni specifiche a tale scopo.
def o.set_name (nome) @name = nome end def o.get_name @name end o.set_name "Andrew" o.get_name # => Andrew
Dovresti notare che la variabile @nome
non ha bisogno di essere inizializzato da nessuna parte. Ruby si occupa di mantenere ciò organizzato per te. Ora possiamo impostare e ottenere le variabili di istanza @nome
. Tuttavia, non è piuttosto brutto da usare imposta nome
e get_name
per le proprietà? Fare qualcosa come o.name = "Andrew"
scrivere e o.name
leggere sarebbe molto più naturale. Vedremo come farlo in un minuto; ma per ora, iniziamo a creare una classe tutta nostra.
È abbastanza semplice creare una classe. Basta usare la seguente sintassi. In questa lezione, creeremo un bel inutile Persona
classe:
classe Persona fine
Ancora una volta, super-semplice. Iniziamo a riempirlo.
Abbiamo visto come creare proprietà: sono solo wrapper di metodi per variabili di istanza. Tuttavia, vogliamo che si comportino in modo più simile al modo in cui ci si aspetterebbe che le proprietà agiscano. È facile per il metodo get:
def name @name end
Dato che siamo all'interno della classe, non dobbiamo dare il nome di un oggetto nella firma del metodo; solo il nome del metodo farà. Quando creiamo un'istanza di Persona
class-Say, p1
-saremo in grado di chiamare questo nel solito modo-p1.name
.
Ma come possiamo migliorare l'aspetto di impostare il @nome
variabile?
Ruby ci regala un po 'di zucchero incredibile per renderlo davvero fantastico. Controllalo:
def name = nome @name = nome fine
Ok, allora? In questo modo, stiamo scrivendo p1.name = ( "Joe")
o quantomeno p1.name = "joe"
, perché le parentesi non sono richieste. È molto meglio? Bene, ecco la parte interessante: puoi inserire gli spazi e Ruby non salterà un battito:
p1.name = "joe"
Ora, possiamo scrivere e leggere le nostre variabili di istanza nel modo in cui ci si aspetterebbe che le proprietà vengano lette.
Ma diventa ancora meglio. Impostare le proprietà con metodi come questo ti dà l'opportunità di fare qualcosa con il valore che l'utente della tua classe passa in-qualcosa di più che assegnarlo a una variabile di istanza, se è appropriato per la tua classe. Tuttavia, ci sono buone probabilità che la maggior parte delle volte farai come abbiamo fatto qui: imposta semplicemente o ottieni le variabili di istanza. In tal caso, Ruby rende ancora più facile. Basta aggiungere questo nella parte superiore della classe:
attr_accessor: name,: age,: your_properties_here
Passaggio attr_accessor
i nomi delle tue proprietà come simboli. Questo crea il var
e var =
metodi per te. Quindi, sarai in grado di utilizzare il @
versioni ovunque nel codice.
Se si desidera proprietà di sola lettura o di sola scrittura, è possibile utilizzare attr_reader
o attr_writer
, rispettivamente. Certo, se usi, dì, attr_writer
, è quindi possibile creare un metodo di lettura personalizzato, se necessario.
Abbiamo visto come creare metodi di istanza; non dimenticare che puoi usare quei valori di proprietà se hai bisogno di:
def greet "# @ name dice, 'Ciao!'" fine
Spesso, ti consigliamo di eseguire qualche codice di configurazione quando viene creata un'istanza di una classe. Questo è fatto in una funzione costruttore. In Ruby, la funzione di costruzione è nominata inizializzare
. Pop questo vicino alla cima del nostro Persona
classe:
def initialize (nome, età, job = 'unemployed') @name = nome @age = age @job = job end
Come puoi vedere, l'inizializzazione richiede tre parametri. Il terzo, lavoro
, è facoltativo, perché gli abbiamo assegnato un valore predefinito. Naturalmente, questo funziona per qualsiasi funzione, non solo per una funzione di costruzione. Ora, quando vogliamo creare un'istanza di persona, dobbiamo fare quanto segue:
joe = Person.new ("Joe", 35, "idraulico") jill = Person.new "Jill", 14
I metodi privati sono funzioni che possono essere chiamate solo da altre funzioni all'interno della classe; non sono esposti al mondo esterno. Il solito modo di creare metodi privati è questo: con tutto il tuo codice pubblico (i metodi di istanza e classe), aggiungi la parola chiave privato
. Qualsiasi funzione che segue questa parola chiave è privata.
# istanza e metodi di classe al di sopra di private def get_real_weight @weight end end # della classe
Se si tenta di chiamare questo metodo su un'istanza di Persona
, non funzionerà.
I metodi e le proprietà delle classi sono funzioni e variabili che non sono accessibili dalle istanze di una classe, ma dalla classe stessa. Ad esempio, creiamo un metodo di classe che restituisca il numero di Persona
istanze che abbiamo creato.
Innanzitutto, dobbiamo creare una variabile di classe che contenga il numero di Persona
istanze che abbiamo creato. Le variabili di classe sono precedute da due simboli. Quindi, aggiungi questo alla tua classe, preferibilmente sotto le linee attr_ *:
@@ count = 0
Ora, ogni volta che creiamo un nuovo Persona
, vogliamo incrementare questa variabile. Cosa viene eseguito ogni volta che facciamo un Persona
? inizializzare
, ovviamente; quindi aggiornalo di conseguenza. Ora sembra così:
def initialize (nome, età, job = 'unemployed') @name = nome @age = age @job = job @@ count + = 1 end
Quindi, ovviamente, dobbiamo creare il metodo di classe:
def self.count @@ count end
Ora provalo:
joe = Person.new ("Joe", 35, "plumber") jill = Person.new ("Jill", 13) bob = Person.new "Bob", 70 Person.count # => 3
Nota - Ruby in realtà non ha metodi di classe (o metodi statici, come li chiamano alcune lingue). C'è in realtà un bel po 'di "magia" in corso sotto la superficie che fa sembrare questi metodi di classe. Entreremo in questo, solitamente chiamato metaprogrammazione, in un capitolo futuro.
Questo è tutto per oggi; se hai qualche domanda, fammelo sapere nei commenti. La prossima volta, esploreremo molti metodi comuni sulle classi Ruby integrate.
PS - Ho giocato con le impostazioni audio del mio microfono. Il volume in questo screncast è abbastanza forte, o dovrebbe essere più alto?