Instantiation och initieringsmetoden

01

av 02

Instantiation och initieringsmetoden

Lära sig Ruby on Rails: Spela med irb
brnzwngs / Flikr / CC BY 2.0

När du definierar en klass i Ruby tilldelar Ruby ett nytt klassobjekt till klassnamn konstant. Till exempel, om du skulle säga klass person; slutet, detta motsvarar ungefär Person = Klass.nytt. Detta klassobjekt är av typen Klassoch innehåller ett antal metoder som är användbara för att göra instanser av kopior av dessa instanser.

02

av 02

Gör instanser

För att skapa en ny instans av en klass, ring den klassens ny metod. Som standard tilldelar detta erforderligt minne för klassen och returnerar en referens till det nya objektet. Så om du skulle göra en ny instans av Person klass, skulle du ringa Person.new.

Även om detta i början verkar lite baklängt, finns det inget ny nyckelord i Ruby eller någon speciell syntax. Nya objekt skapas genom en normal metod som, allt sagt och gjort, gör relativt enkla saker.

Initiera instanser

Ett tomt föremål är inte så spännande. För att börja använda ditt objekt måste det först initialiseras (förutsatt att det har något

instagram viewer
instansvariabler som behöver initialiseras). Detta görs via initialize metod. Ruby skickar alla argument du överför till SomeClass.new vidare till initialize på det nya objektet. Du kan sedan använda vanliga variabla tilldelningar och metoder för att initiera objektets tillstånd. I det här exemplet, a Person klass presenteras vars initialize metoden tar ett namn- och åldersargument och tilldelar dem till instansvariabler.

klass Person def initialisera (namn, ålder) @ namn, @age = namn, ålderslut slut bob = Person.nytt ('Bob', 34)

Du kan också använda den här möjligheten för att skaffa resurser du behöver. Öppet nätverk sockets, öppna filer, läs in all information du behöver etc. Den enda varning är att människor i allmänhet inte förväntar sig initialize metoder för att misslyckas. Se till att dokumentera eventuella misslyckanden initialize metoder noggrant.

Förstörande föremål

I allmänhet förstör du inte föremål i Ruby. Om du kommer från C ++ eller något annat språk utan en sopor, kan det tyckas konstigt. Men i Ruby (och de flesta andra skräppost samlade språk) förstör du inte föremål, du slutar helt enkelt att hänvisa till det. På nästa skräppassningscykel förstörs alla objekt utan att det hänvisar till det automatiskt. Det finns några buggar med cirkulära referenser, men i allmänhet fungerar det felfritt och du behöver inte ens en "destruktor".

Om du undrar om resurser, oroa dig inte om det. När objektet som innehar resursen förstörs kommer resursen att frigöras. Öppna filer och nätverksanslutningar kommer att stängas, minnet omfördelas etc. Endast om du tilldelar några resurser i en C-tillägg behöver du verkligen oroa dig för omfördelning av resurser. Även om det inte finns någon garanti när sopor samlaren kommer att köras. För att fördela resurser i en i god tid försök att frigöra dem manuellt.

Göra kopior av objekt

Ruby är godkänd. Om du skickar en referens till ett objekt till en metod, och den metoden kallar en metod som modifierar objektets tillstånd, oavsiktliga konsekvenser kan uppstå. Vidare kan metoder sedan spara referensen till objektet att modifiera vid en mycket senare tidpunkt, vilket orsakar en försenad effekt för felet. För att undvika detta tillhandahåller Ruby några metoder för att duplicera objekt.

För att kopiera alla objekt, ring bara some_object.dup metod. Ett nytt objekt tilldelas och alla objektets instansvariabler kopieras över. Men att kopiera instansvariabler är vad detta var tänkt att undvika: det här är det som kallas en "grund kopia." Om du skulle hålla en fil i en instansvariabel, båda duplicerade objekten skulle nu referera till samma fil.

Tänk bara på att kopiorna är grunda kopior innan du använder den dup metod. Se artikeln Skapa djupa kopior i Ruby för mer information.

instagram story viewer