Ruby ist eine der beliebtesten Sprachen im Internet. Wir haben vor kurzem eine neue Screencast-Serie hier auf Nettuts + gestartet, die Sie in Ruby einführen wird, sowie die großartigen Frameworks und Werkzeuge, die mit der Entwicklung von Ruby einhergehen. In diesem Kapitel betrachten wir die Erstellung unserer eigenen Ruby-Klassen.
In Kapitel 2 haben wir gelernt, einem bereits vorhandenen Objekt Methoden hinzuzufügen. Wenn wir mit einem leeren Objekt beginnen möchten, das wir mit Methoden und Eigenschaften erweitern können, können wir einfach eine Instanz von erstellen Objekt
Klasse.
o = Object.new def o.my_method 1 + 1 end o.my_method # => 2
Was ist mit Eigenschaften? Nun, Ruby hat Instanzvariablen (Variablen, die jede Instanz eines Objekts erhält). Eine Instanzvariable beginnt mit einem 'at'-Zeichen (@
). Sie können diese Instanzvariablen abrufen und festlegen, indem Sie Funktionen speziell für diesen Zweck erstellen.
def o.set_name (name) @name = name end def o.get_name @name end o.set_name "Andrew" o.get_name # => Andrew
Sie sollten beachten, dass die Variable @Name
muss nirgendwo initialisiert werden. Ruby sorgt dafür, dass das für Sie organisiert bleibt. Jetzt können wir die Instanzvariablen setzen und abrufen @Name
. Ist es nicht ziemlich hässlich zu benutzen Name einsetzen
und get_name
für Eigenschaften? Etwas zu tun o.name = "Andrew"
zu schreiben und o.name
Lesen wäre so viel natürlicher. Wir werden in einer Minute sehen, wie das geht. Aber jetzt beginnen wir mit dem Erstellen einer eigenen Klasse.
Es ist ziemlich einfach, eine Klasse zu erstellen. Verwenden Sie einfach die folgende Syntax. In dieser Lektion erstellen wir ein ziemlich nutzloses Person
Klasse:
Klasse Person Ende
Wieder super einfach. Fangen wir an, es auszufüllen.
Wir haben gesehen, wie man Eigenschaften erstellt: Sie sind nur Methodenwrapper für Instanzvariablen. Wir möchten jedoch, dass sie sich eher so verhalten, wie Sie es von Immobilien erwarten. Es ist einfach für die Get-Methode:
def name @name ende
Da wir uns in der Klasse befinden, müssen wir nicht den Namen eines Objekts in der Methodensignatur angeben. Nur der Name der Methode reicht aus. Wenn wir eine Instanz von erstellen Person
Klasse sagen, p1
-Wir können dies auf die übliche Weise aufrufen-p1.name
.
Aber wie können wir das Erscheinungsbild verbessern @Name
Variable?
Ruby gibt uns ein unglaubliches bisschen Zucker, um das wirklich cool zu machen. Überprüfen Sie dies heraus:
def name = name @name = name ende
Okay, na und? Auf diese Weise schreiben wir p1.name = ("joe")
oder zumindest p1.name = "joe"
, weil Klammern nicht erforderlich sind. Ist das viel besser? Nun, hier ist der coole Teil: Sie können die Leerzeichen einfügen und Ruby wird keinen Takt überspringen:
p1.name = "joe"
Jetzt können wir unsere Instanzvariablen so schreiben und lesen, wie Sie es erwarten würden.
Aber es wird noch besser. Das Festlegen von Eigenschaften über Methoden wie diese gibt Ihnen die Möglichkeit, etwas mit dem Wert zu tun, den der Benutzer Ihrer Klasse übergibt - etwas mehr als nur einer Instanzvariablen zuzuordnen, sofern dies für Ihre Klasse angemessen ist. Es besteht jedoch eine gute Chance, dass Sie die meiste Zeit genau so machen, wie wir es hier haben: Einfach die Instanzvariablen setzen oder abrufen. In diesem Fall macht Ruby es noch einfacher. Fügen Sie dies einfach an der Spitze Ihrer Klasse hinzu:
attr_accessor: name,: age,: your_properties_here
Bestehen attr_accessor
die Namen Ihrer Eigenschaften als Symbole. Das schafft die var
und var =
Methoden für Sie. Dann können Sie das verwenden @
Versionen, wo immer Sie in Ihrem Code benötigen.
Wenn Sie schreibgeschützte oder schreibgeschützte Eigenschaften wünschen, können Sie verwenden attr_reader
oder attr_writer
, beziehungsweise. Natürlich, wenn Sie verwenden, sagen Sie, attr_writer
, Sie können dann bei Bedarf eine benutzerdefinierte Lesemethode erstellen.
Wir haben gesehen, wie Instanzmethoden erstellt werden. Vergessen Sie nicht, dass Sie diese Eigenschaftswerte verwenden können, wenn Sie Folgendes benötigen:
def greet "# @ name sagt: 'Hallo dort!'" Ende
Häufig möchten Sie einen Setup-Code ausführen, wenn eine Instanz einer Klasse erstellt wird. Dies geschieht in einer Konstruktorfunktion. In Ruby wird die Konstruktorfunktion benannt initialisieren
. Pop dies in der Nähe unseres Person
Klasse:
def initialize (Name, Alter, Job = 'arbeitslos') @name = name @age = Alter @job = Jobende
Wie Sie sehen, benötigt initialize drei Parameter. Der dritte, Job
, ist optional, da wir einen Standardwert angegeben haben. Dies funktioniert natürlich für jede Funktion, nicht nur für eine Konstruktorfunktion. Wenn wir nun eine Instanz einer Person erstellen möchten, müssen wir Folgendes tun:
joe = person.new ("Joe", 35, "Klempner") jill = person.new "Jill", 14
Private Methoden sind Funktionen, die nur von anderen Funktionen innerhalb der Klasse aufgerufen werden können. Sie sind nicht der Außenwelt ausgesetzt. Normalerweise erstellen Sie private Methoden wie folgt: Fügen Sie unter all Ihrem öffentlichen Code (der Instanz- und Klassenmethode) das Schlüsselwort hinzu Privatgelände
. Alle Funktionen, die diesem Schlüsselwort folgen, sind privat.
# Instanz- und Klassenmethoden über private def get_real_weight @weight end end # der Klasse
Wenn Sie versuchen, diese Methode in einer Instanz von aufzurufen Person
, es wird nicht funktionieren.
Klassenmethoden und Eigenschaften sind Funktionen und Variablen, auf die nicht von Instanzen einer Klasse, sondern von der Klasse selbst aus zugegriffen werden kann. Erstellen wir beispielsweise eine Klassenmethode, die die Anzahl von zurückgibt Person
Instanzen, die wir erstellt haben.
Zuerst müssen wir eine Klassenvariable erstellen, die die Anzahl von enthält Person
Instanzen, die wir erstellt haben. Klassenvariablen sind zwei Vorzeichen vorangestellt. Fügen Sie dies Ihrer Klasse hinzu, vorzugsweise unter den Zeilen attr_ *:
@@ count = 0
Nun, wann immer wir etwas Neues machen Person
, Wir möchten diese Variable erhöhen. Was läuft jedes Mal, wenn wir eine machen Person
? initialisieren
, Na sicher; Aktualisieren Sie es entsprechend. Nun sieht es so aus:
def initialize (name, alter, job = 'arbeitslos') @name = name @age = alter @job = job @@ count + = 1 ende
Dann müssen wir natürlich die Klassenmethode erstellen:
def self.count @@ count end
Jetzt probieren Sie es aus:
joe = Person.neu ("Joe", 35, "Klempner") Jill = Person.neu ("Jill", 13) bob = Person.neu "Bob", 70 Personenanzahl # => 3
Hinweis - Ruby hat keine Klassenmethoden (oder statische Methoden, wie sie von manchen Sprachen genannt werden). Unter der Oberfläche geschieht ein ziemlich cooles Stück "Magie", das diese Klassenmethoden aussehen lässt. Wir werden in einem zukünftigen Kapitel auf das - gewöhnlich Metaprogrammieren - eingehen.
Das war `s für heute; Wenn Sie Fragen haben, lassen Sie es mich in den Kommentaren wissen. Beim nächsten Mal werden wir viele gängige Methoden in den integrierten Ruby-Klassen untersuchen.
PS - Ich habe mit den Toneinstellungen an meinem Mikrofon gespielt. Ist die Lautstärke in diesem Screncast laut genug oder sollte sie höher sein??