01
van 02
Instantiatie en de initialisatiemethode

Wanneer u een klasse in Ruby definieert, wijst Ruby een nieuw klasseobject toe aan de klasse naam constant. Bijvoorbeeld als je zou zeggen klasse persoon; einde, dit komt ongeveer overeen met Persoon = Klasse. Nieuw. Dit klasseobject is van het type Klasseen bevat een aantal methoden die nuttig zijn voor het maken van exemplaren van kopieën van die exemplaren.
02
van 02
Instanties maken
Als u een nieuwe instantie van een klasse wilt maken, belt u die klasse nieuw methode. Standaard wordt hiermee het vereiste geheugen voor de klasse toegewezen en wordt een verwijzing naar het nieuwe object geretourneerd. Dus als u een nieuw exemplaar van de zou maken Persoon klas, zou je bellen Persoon. Nieuw.
Hoewel dit in het begin een beetje achteruit lijkt, is er geen nieuw trefwoord in Ruby of een speciale syntaxis. Nieuwe objecten worden gemaakt via een normale methode die, alles gezegd en gedaan, relatief eenvoudige dingen doet.
Instanties initialiseren
Een leeg voorwerp is niet erg spannend. Om uw object te kunnen gebruiken, moet het eerst worden geïnitialiseerd (ervan uitgaande dat het er een heeft instantievariabelen dat moet worden geïnitialiseerd). Dit gebeurt via de initialiseren methode. Ruby zal alle argumenten doorgeven die u doorgeeft SomeClass.new op naar initialiseren op het nieuwe object. Vervolgens kunt u normale variabele toewijzingen en methoden gebruiken om de status van het object te initialiseren. In dit voorbeeld is een Persoon klasse wordt gepresenteerd wiens initialiseren methode neemt een naam- en leeftijdsargument en wijst ze toe aan instantievariabelen.
klasse Persoon def initialiseert (naam, leeftijd) @naam, @age = naam, leeftijd einde bob = Persoon.nieuw ('Bob', 34)
U kunt deze gelegenheid ook gebruiken om alle benodigde bronnen te verwerven. Open netwerk stopcontacten, bestanden openen, alle gegevens lezen die u nodig heeft, enz. Het enige voorbehoud is dat mensen het over het algemeen niet verwachten initialiseren methoden om te falen. Zorg ervoor dat u eventuele mislukkingen documenteert initialiseren methoden grondig.
Objecten vernietigen
Over het algemeen vernietig je geen objecten in Ruby. Als je uit C ++ of een andere taal komt zonder een vuilnisman, lijkt dit misschien raar. Maar in Ruby (en de meeste andere vuilnis verzamelde talen) vernietig je geen objecten, je stopt er gewoon mee om ernaar te verwijzen. Bij de volgende garbage collection-cyclus wordt elk object zonder iets dat ernaar verwijst automatisch vernietigd. Er zijn enkele bugs met kringverwijzingen, maar over het algemeen werkt dit foutloos en heb je zelfs geen "destructor" nodig.
Maak je geen zorgen als je je afvraagt welke bronnen je hebt. Wanneer het object dat de bron bevat wordt vernietigd, wordt de bron vrijgemaakt. Open bestanden en netwerkverbindingen worden gesloten, geheugen wordt vrijgemaakt enz. Alleen als u bronnen toewijst in een C-extensie, moet u zich echt zorgen maken over het vrijgeven van bronnen. Hoewel er geen garantie is wanneer de vuilnisman zal worden uitgevoerd. Om middelen toe te wijzen in een tijdig manier, probeer ze handmatig te bevrijden.
Kopieën maken van objecten
Ruby is een referentie. Als u een verwijzing naar een object doorgeeft aan een methode, en die methode roept een methode aan die de toestand van dat object wijzigt, er kunnen onbedoelde gevolgen optreden. Bovendien kunnen methoden de verwijzing naar het object opslaan om het op een veel later tijdstip te wijzigen, wat een vertraagd effect voor de bug veroorzaakt. Om dit te voorkomen, biedt Ruby enkele methoden om objecten te dupliceren.
Om een object te dupliceren, belt u gewoon de some_object.dup methode. Er wordt een nieuw object toegewezen en alle instantievariabelen van het object worden gekopieerd. Dit was echter de bedoeling om exemplaarvariabelen te kopiëren: dit wordt een "ondiepe kopie" genoemd. Als u zou een bestand in een instantievariabele bewaren, beide gedupliceerde objecten zouden nu naar hetzelfde verwijzen het dossier.
Houd er rekening mee dat de kopieën ondiepe kopieën zijn voordat u de dup methode. Zie het artikel Diepe kopieën maken in Ruby voor meer informatie.