Ruby pentru începători Lucrul cu clasele

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.


Ajunge din urmă

  • Partea 1:Instalarea Ruby și începutul
  • Partea 2:Variabile, tipuri de date și fișiere 
  • Partea 3:Lucrul cu clasele

Vizualizați ecranul


Modificarea unui obiect gol

Î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.


Crearea unei clase

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.


Crearea proprietăților

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.


Crearea metodei instanței

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! "

Crearea unui constructor

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

Crearea metodelor private

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.


Crearea metodelor de clasă și a variabilelor

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.

Concluzie

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?

Cod