Ruby for Newbies Arbeta med klasser

Ruby är ett av de mest populära språk som används på webben. Vi har nyligen startat en ny screencastserie här på Netuts + som introducerar dig till Ruby, liksom de stora ramar och verktyg som följer med Ruby-utveckling. I det här kapitlet tar vi en titt på att skapa egna Ruby-klasser.


Komma ikapp

  • Del 1:Installera Ruby och Komma igång
  • Del 2:Variabler, datatyper och filer 
  • Del 3:Arbeta med klasser

Visa skärmdump


Ändra ett tomt objekt

I kapitel två lärde vi oss hur man lägger till metoder för ett redan existerande objekt. Om vi ​​vill börja med ett tomt objekt som vi kan förstärka med metoder och egenskaper, kan vi bara skapa en instans av Objekt klass.

o = Object.new def o.my_method 1 + 1 slutet o.my_method # => 2

Vad sägs om egenskaper? Nå, Ruby har instansvariabler (variabler som varje förekomst av ett objekt får); en instansvariabel börjar med ett "at" -tecken (@). Du kan få och ställa in dessa instansvariabler genom att skapa funktioner speciellt för det ändamålet.

def o.set_name (namn) @name = namn slut def o.get_name @name slut o.set_name "Andrew" o.get_name # => Andrew

Du bör notera att variabeln @namn behöver inte initialiseras någonstans. Ruby tar hand om att hålla det organiserade för dig. Nu kan vi ställa in och få instansvariablerna @namn. Men är det inte ganska litet att använda Ange namn och hämta namn för fastigheter? Gör något liknande o.name = "Andrew" att skriva och o.name att läsa skulle vara så mycket mer naturligt. Vi får se hur man gör det på en minut; men för nu, låt oss börja skapa en egen klass.


Skapa en klass

Det är ganska enkelt att skapa en klass. Använd bara följande syntax. I den här lektionen kommer vi att skapa en ganska meningslös Person klass:

personens slut

Återigen, super enkel. Låt oss börja fylla i det.


Skapa egenskaper

Vi har sett hur man skapar egenskaper: de är bara metodomslagare, till exempel variabler. Vi vill dock att de ska agera mer som hur du förväntar dig att egenskaper ska fungera. Det är enkelt för get-metoden:

def namn @ namn slutet

Eftersom vi är inne i klassen behöver vi inte ge namnet på ett objekt i metodens signatur; bara namnet på metoden kommer att göra. När vi skapar en instans av Person klass-säg, p1-vi kan ringa detta på vanligt sätt-p1.name.

Men hur kan vi förbättra utseendet att ställa in @namn variabel?

Ruby ger oss en otrolig bit socker för att göra detta riktigt coolt. Kolla in det här:

def name = namn @ namn = namn slutet

Okej, vad då? På så sätt skriver vi p1.name = ( "joe") eller åtminstone p1.name = "joe", eftersom parentes inte är nödvändiga. Är det mycket bättre? Tja, här är den snygga delen: du kan lägga in mellanslag och Ruby kommer inte att hoppa över ett slag:

p1.name = "joe"

Nu kan vi skriva och läsa våra instansvariabler som du förväntar dig att egenskaper ska läsas.

Men det blir ännu bättre. Att ställa in egenskaper med hjälp av metoder som detta ger dig möjlighet att göra något med det värde som användaren av din klass passerar in något mer än bara ange den till en instansvariabel, om det passar för din klass. Det finns dock en bra chans att det mesta du gör, precis som vi har här: Ange eller få instansvariablerna. I det fallet gör Ruby det ännu enklare. Lägg bara till detta högst upp i din klass:

attr_accessor: namn,: ålder,: your_properties_here

Passera attr_accessor namnen på dina egenskaper som symboler. Detta skapar var och var = metoder för dig. Då kan du använda @ versioner var du än behöver i din kod.

Om du vill ha skrivskyddade egenskaper, kan du använda attr_reader eller attr_writer, respektive. Självklart, om du använder, säg, attr_writer, Du kan då skapa en anpassad läsar metod om det behövs.


Skapa instansmetod

Vi har sett hur man skapar instansmetoder. glöm inte att du kan använda dessa egenskaper om du behöver:

def greet "# @ name säger" Hej där! "" slutet

Skapa en byggare

Ofta vill du utföra vissa inställningskoder när en instans av en klass skapas. Detta görs i en konstruktörfunktion. I Ruby heter konstruktörfunktionen initialisera. Pop detta nära toppen av vårt Person klass:

def initiera (namn, ålder, jobb = 'arbetslös') @name = namn @age = ålder @job = jobb slut

Som du kan se initierar du tre parametrar. Den tredje, jobb, är valfritt, eftersom vi har gett det ett standardvärde. Naturligtvis fungerar detta för någon funktion, inte bara en konstruktörsfunktion. Nu, när vi vill skapa en instans av person, måste vi göra följande:

joe = Person.new ("Joe", 35, "rörmokare") jill = Person.new "Jill", 14

Skapa privata metoder

Privata metoder är funktioner som endast kan kallas av andra funktioner inom klassen. de är inte utsatta för omvärlden. Det vanliga sättet att skapa privata metoder är följande: Lägg till sökordet under all din offentliga kod (förekomst- och klassmetoderna) privat. Alla funktioner som följer detta nyckelord är privata.

 # förekomst och klassmetoder ovanför privata def get_real_weight @weight slutet slutet av klassen

Om du försöker ringa den här metoden i en instans av Person, det kommer inte fungera.


Skapa klassmetoder och variabler

Klassmetoder och egenskaper är funktioner och variabler som inte är tillgängliga från fall av en klass, men från själva klassen. Låt oss till exempel skapa en klassmetod som returnerar antalet Person instanser vi har skapat.

Först måste vi skapa en klassvariabel som rymmer antalet Person instanser vi har skapat. Klassvariablerna är prefixade med två signaler. Så lägg till detta i din klass, helst under attr_ * -raderna:

@@ count = 0

Nu, när vi gör en ny Person, vi vill öka denna variabel. Vad körs varje gång vi gör en Person? initialisera, självklart; så uppdatera det i enlighet med detta. Nu ser det ut så här:

def initiera (namn, ålder, jobb = 'arbetslös') @name = namn @age = ålder @job = jobb @@ count + = 1 slut

Då måste vi naturligtvis skapa klassmetoden:

def self.count @@ count end

Nu, gör det här ett försök:

joe = Person.new ("Joe", 35, "rörmokare") jill = Person.new ("Jill", 13) bob = Person.new "Bob", 70 Person.count # => 3

Notera - Ruby har inte riktigt klassmetoder (eller statiska metoder, som vissa språk kallar dem). Det finns faktiskt en ganska cool bit av "magi" som händer under ytan som gör att dessa ser ut som klassmetoder. Vi kommer in i det som vanligtvis kallas metaprogramming-i ett kommande kapitel.

Slutsats

Det är det för idag; Om du har några frågor, låt mig veta i kommentarerna. Nästa gång kommer vi att utforska många vanliga metoder på de inbyggda Ruby-klasserna.

PS - Jag har spelat med ljudinställningarna på min mikrofon. Är volymen i denna screncast tillräckligt hög, eller ska den vara högre?