Ruby este una dintre cele mai populare limbi folosite pe web. Am lansat recent o nouă serie de difuzare pe Nettuts +, care vă va prezenta Ruby, precum și marile cadre și instrumente care merg împreună cu dezvoltarea Ruby. În acest capitol vom examina crearea propriilor clase de Ruby.
În capitolul doi, am învățat cum să adăugăm metode unui obiect deja existent. Dacă vrem să începem cu un obiect gol, pe care apoi îl putem mări cu metode și proprietăți, putem crea doar o instanță a Obiect
clasă.
o = Object.new def o.my_method 1 + 1 end o.my_method # => 2
Cum rămâne cu proprietățile? Ruby are variabile de instanță (variabile pe care fiecare instanță a unui obiect le primește); o variabilă de instanță începe cu un semn 'at' (@
). Puteți obține și seta aceste variabile de instanță prin crearea de funcții în special în acest scop.
def nume o.set_name (nume) @ nume = nume sfarsit def nume_get_name @ nume nume sfarsit o.set_name "Andrew" o.get_name # => Andrew
Trebuie să rețineți că variabila @Nume
nu trebuie să fie inițializată oriunde. Ruby se ocupă de păstrarea organizării pentru dvs. Acum, putem seta și obține variabilele de instanță @Nume
. Cu toate acestea, nu este destul de urât să se folosească Pune un nume
și get_name
pentru proprietăți? Fac ceva de genul o.name = "Andrew"
pentru a scrie și o.name
pentru a citi ar fi mult mai natural. Vom vedea cum să facem acest lucru într-un minut; dar pentru moment, să începem să creăm o clasă proprie.
Este destul de simplu să creați o clasă. Doar utilizați următoarea sintaxă. În această lecție, vom crea o inutilă Persoană
clasă:
clasa persoană sfârșit
Din nou, foarte simplu. Să începem să o umplem.
Am văzut cum să creăm proprietăți: sunt doar pachete de metode pentru variabilele de exemplu. Cu toate acestea, dorim ca ei să se comporte mai mult cu modul în care vă așteptați ca proprietățile să acționeze. Este ușor pentru metoda de a obține:
Def nume nume @ sfârșitul
Deoarece suntem în interiorul clasei, nu trebuie să dăm numele unui obiect în semnătura metodei; doar numele metodei va face. Atunci când creăm o instanță a Persoană
clasa-spune, p1
-vom putea să sunăm în modul obișnuit-p1.name
.
Dar cum putem îmbunătăți aspectul de a stabili @Nume
variabil?
Ruby ne dă un incredibil zahăr pentru a face acest lucru cu adevărat cool. Verificați acest lucru:
def nume = nume @ nume = nume sfârșit
Bine, deci ce? În acest fel, scriem p1.name = ( "joe")
sau cel puțin p1.name = "joe"
, deoarece nu sunt necesare paranteze. E mult mai bine? Ei bine, iată partea răcească: puteți pune în spații și Ruby nu va sări peste un ritm:
p1.name = "joe"
Acum, putem scrie și citi variabilele noastre de instanță așa cum ați aștepta ca proprietățile să fie citite.
Dar devine și mai bine. Setarea proprietăților prin intermediul unor astfel de metode vă oferă posibilitatea de a face ceva cu valoarea pe care utilizatorul din clasa dvs. trece înăuntru - ceva mai mult decât să îl atribuiți unei variabile de instanță, dacă aceasta este potrivită pentru clasa dvs. Cu toate acestea, există o șansă bună ca, de cele mai multe ori, să faceți așa cum avem aici: setați pur și simplu sau obțineți variabilele de instanță. În acest caz, Ruby face chiar mai ușor. Doar adăugați acest lucru în partea de sus a clasei dvs.:
attr_accessor: name,: age,: your_properties_here
Trece attr_accessor
numele proprietăților dvs. ca simboluri. Aceasta creează var
și var =
metode pentru tine. Apoi, veți putea utiliza funcția @
versiuni ori de câte ori aveți nevoie în codul dvs..
Dacă doriți proprietăți numai pentru citire sau numai pentru scriere, puteți utiliza attr_reader
sau attr_writer
, respectiv. Desigur, dacă folosiți, să zicem, attr_writer
, apoi puteți crea o metodă personalizată pentru cititor dacă este necesar.
Am văzut cum să creăm metode de instanță; nu uitați că puteți utiliza aceste valori ale proprietății dacă trebuie să:
def greet "# @ name spune," Bună ziua! "
Adesea, veți dori să efectuați un anumit set de cod atunci când este creată o instanță a unei clase. Aceasta se face într-o funcție a constructorului. În Ruby, se numește funcția constructor inițializa
. Afișează-l aproape de partea superioară a noastră Persoană
clasă:
def initialize (nume, vârstă, loc de muncă = șomer) @name = nume @age = vârstă @job = sfârșit de activitate
După cum puteți vedea, inițializa are trei parametri. Al treilea, loc de munca
, este opțional, deoarece i-am oferit o valoare implicită. Desigur, aceasta funcționează pentru orice funcție, nu doar pentru o funcție constructor. Acum, când vrem să creăm un exemplu de persoană, trebuie să facem următoarele:
joe = Person.new ("Joe", 35, "instalator") jill = Person.new "Jill", 14
Metodele private sunt funcții care pot fi numite doar de alte funcții din cadrul clasei; ei nu sunt expuși la lumea exterioară. Metoda obișnuită de a crea metode private este următoarea: sub întregul cod public (metoda de instanță și de clasă), adăugați cuvântul cheie privat
. Orice funcții care urmează acest cuvânt cheie sunt private.
# exemple și metode de clasă de mai sus private def get_real_weight @weight end end # din clasă
Dacă încercați să apelați această metodă pe o instanță de Persoană
, nu va funcționa.
Metodele și proprietățile de clasă sunt funcții și variabile care nu sunt accesibile din instanțele unei clase, ci din clasa însăși. De exemplu, hai să creăm o metodă de clasă care returnează numărul de Persoană
instanțele pe care le-am creat.
În primul rând, trebuie să creăm o variabilă de clasă care să dețină numărul de Persoană
instanțele pe care le-am creat. Variabilele de clasă sunt prefixate cu două at-semne. Deci, adăugați acest lucru la clasa dvs., preferabil sub liniile attr_ *:
@@ număr = 0
Acum, ori de câte ori ne facem un nou Persoană
, dorim să creștem această variabilă. Ce se întâmplă de fiecare dată când facem a Persoană
? inițializa
, desigur; actualizați-o în consecință. Acum se arată astfel:
def initialize (nume, varsta, job = 'unemployed') @name = nume @age = varsta @job = job @@ count + = 1 sfarsit
Apoi, desigur, trebuie să creăm metoda de clasă:
def self.count @@ numără sfârșit
Acum, încercați:
joe = Person.new ("Joe", 35, "instalator") jill = Person.new ("Jill", 13) bob = Person.new "Bob"
Notă - Ruby nu are metode de clasă (sau metode statice, așa cum le numesc unele limbi). Există de fapt un pic destul de rece de "magie", care se desfășoară sub suprafață, ceea ce face ca acestea să pară ca metode de clasă. Vom intra în asta - de obicei numită metaprogramare - într-un capitol viitor.
Asta e pentru ziua de azi; dacă aveți întrebări, anunțați-ne în comentarii. Data viitoare vom explora multe metode comune pe clasele încorporate în Ruby.
PS - Am jucat cu setările de sunet de pe microfonul meu. Este suficient volumul din această imagine sau ar trebui să fie mai mare?