Ruby er et av de mest populære språkene som brukes på nettet. Vi har nylig startet en ny screencast-serie her på Nettuts + som vil introdusere deg til Ruby, samt de flotte rammene og verktøyene som følger med Ruby-utviklingen. I dette kapitlet tar vi en titt på å lage våre egne Ruby-klasser.
I kapittel 2 lærte vi å legge til metoder til et allerede eksisterende objekt. Hvis vi ønsker å starte med et tomt objekt som vi kan forstørre med metoder og egenskaper, kan vi bare lage en forekomst av Gjenstand
klasse.
o = Object.new def o.my_metod 1 + 1 ende o.my_method # => 2
Hva med egenskaper? Vel, Ruby har instansvariabler (variabler som hver forekomst av et objekt blir); en instansvariabel starter med et "på" -tegn (@
). Du kan få og sette disse instansvariablene ved å skape funksjoner spesielt for det formålet.
def o.set_name (navn) @name = navn ende def o.get_name @navn slutt o.set_name "Andrew" o.get_name # => Andrew
Du bør merke seg at variabelen @Navn
trenger ikke initialiseres hvor som helst. Ruby tar seg av å holde det organisert for deg. Nå kan vi sette og få instansvariablene @Navn
. Men er det ikke ganske stygg å bruke sett
og get_name
for eiendommer? Gjør noe slikt o.name = "Andrew"
å skrive og o.name
å lese ville være så mye mer naturlig. Vi får se hvordan du gjør dette om et øyeblikk; men for nå, la oss begynne å lage en egen klasse.
Det er ganske enkelt å lage en klasse. Bare bruk følgende syntaks. I denne leksjonen vil vi skape en ganske ubrukelig Person
klasse:
Klassen Person slutt
Igjen, super enkel. La oss begynne å fylle den inn.
Vi har sett hvordan du lager egenskaper: de er bare metodeinnpakninger, for eksempel variabler. Vi vil imidlertid at de skal opptre mer som hvordan du forventer at eiendommene skal fungere. Det er enkelt for få-metoden:
def navn @ navn slutt
Siden vi er inne i klassen, trenger vi ikke å gi navnet på et objekt i metoden signaturen; bare navnet på metoden vil gjøre. Når vi lager en forekomst av Person
klasse-si, p1
-Vi kan ringe dette på vanlig måte-p1.name
.
Men hvordan kan vi forbedre utseendet på å sette inn @Navn
variabel?
Ruby gir oss en utrolig bit sukker for å gjøre dette veldig kul. Sjekk ut dette:
def navn = navn @ name = navn slutt
Ok, så hva? På denne måten skriver vi p1.name = ( "Joe")
i det minste p1.name = "joe"
, fordi parentes ikke er nødvendig. Er det mye bedre? Vel, her er den kule delen: Du kan legge inn mellomrom og Ruby vil ikke hoppe over et slag:
p1.name = "joe"
Nå kan vi skrive og lese våre instansvariabler slik du forventer at egenskapene skal leses.
Men det blir enda bedre. Innstilling av egenskaper ved hjelp av metoder som dette gir deg muligheten til å gjøre noe med verdien som brukeren av din klasse passerer inn noe mer enn bare tilordne den til en instansvariabel, hvis det passer for din klasse. Det er imidlertid en god sjanse for at mesteparten av tiden du vil gjøre akkurat som vi har her: bare sett eller få instansvariablene. I så fall gjør Ruby det enda enklere. Bare legg til dette øverst i klassen din:
attr_accessor: navn,: alder,: your_properties_here
Passere attr_accessor
navnene på egenskapene dine som symboler. Dette skaper Var
og var =
metoder for deg. Deretter kan du bruke @
versjoner uansett hvor du trenger i koden din.
Hvis du vil ha skrivebeskyttet eller skrivebeskyttet egenskaper, kan du bruke attr_reader
eller attr_writer
, henholdsvis. Selvfølgelig, hvis du bruker, si, attr_writer
, Du kan da opprette en tilpasset leser-metode hvis det er nødvendig.
Vi har sett hvordan du oppretter eksempelmetoder; ikke glem at du kan bruke disse eiendomsverdiene hvis du trenger å:
def greet "# @ name sier" Hei der! "" slutten
Ofte vil du ønske å utføre noen oppsettkode når en forekomst av en klasse er opprettet. Dette gjøres i en konstruktørfunksjon. I Ruby er konstruktørfunksjonen navngitt initial
. Pop dette nær toppen av vår Person
klasse:
def initialisere (navn, alder, jobb = 'arbeidsledig') @name = navn @age = alder @job = jobb slutt
Som du kan se, tar initialiseringen tre parametere. Den tredje, jobb
, er valgfritt, fordi vi har gitt den en standardverdi. Selvfølgelig virker dette for enhver funksjon, ikke bare en konstruktørfunksjon. Nå, når vi ønsker å skape en forekomst av person, må vi gjøre følgende:
joe = Person.new ("Joe", 35, "rørlegger") jill = Person.new "Jill", 14
Private metoder er funksjoner som kun kan kalles av andre funksjoner i klassen; de er ikke utsatt for omverdenen. Den vanlige måten å lage private metoder er dette: Legg til søkeordet under all din offentlige kode (forekomst og klassemetoder) privat
. Eventuelle funksjoner som følger dette søkeordet er private.
# eksempel og klassemetoder over private def get_real_weight @weight slutten # av klassen
Hvis du prøver å ringe denne metoden på en forekomst av Person
, det vil ikke fungere.
Klassemetoder og egenskaper er funksjoner og variabler som ikke er tilgjengelige fra forekomster av en klasse, men fra selve klassen. For eksempel, la oss lage en klassemetode som returnerer antall Person
forekomster vi har opprettet.
Først må vi opprette en klassevariabel som vil holde antall Person
forekomster vi har opprettet. Klassevariabler er prefiks med to tegn. Så legg til dette i klassen din, helst under attr_ * linjene:
@@ count = 0
Nå, når vi lager en ny Person
, Vi vil øke denne variabelen. Hva kjører hver gang vi lager en Person
? initial
, selvfølgelig; så oppdatere det tilsvarende. Nå ser det slik ut:
def initialisere (navn, alder, jobb = 'arbeidsledig') @name = navn @age = alder @job = jobb @@ telle + = 1 ende
Da må selvfølgelig vi lage klassemetoden:
def self.count @@ count end
Nå, prøv dette:
joe = Person.new ("Joe", 35, "rørlegger") jill = Person.new ("Jill", 13) bob = Person.new "Bob", 70 Person.count # => 3
Merk - Ruby har egentlig ikke klassemetoder (eller statiske metoder, som noen språk kaller dem). Det er faktisk en ganske kul bit av "magi" som skjer under overflaten som gjør at disse ser ut som klassemetoder. Vi kommer inn i det - vanligvis kalt metaprogrammering - i et fremtidig kapittel.
Det er det for i dag; hvis du har noen spørsmål, gi meg beskjed i kommentarene. Neste gang vil vi utforske mange vanlige metoder på de innebygde Ruby-klassene.
PS - Jeg har spilt med lydinnstillingene på mikrofonen min. Er volumet i denne screncast høyt nok, eller skal det være høyere?