Ruby for Newbies Operatoren und ihre Methoden

Ruby ist eine der beliebtesten Sprachen im Internet. Wir haben hier auf Nettuts + eine neue Screencast-Serie gestartet, die Sie in Ruby einführen wird, sowie die großartigen Frameworks und Werkzeuge, die mit der Entwicklung von Ruby einhergehen. In dieser Lektion werden die Operatoren in Ruby genauer unter die Lupe genommen und warum sie sich von allen anderen unterscheiden, die Sie je zuvor gesehen haben.


Betreiber

Sie kennen sich mit den Bedienern aus.

1 + 2 # 3 Person [: name] = "Joe"

Operatoren sind Dinge wie das Pluszeichen (einer der arithmetischen Operatoren) oder das Gleichheitszeichen (der Zuweisungsoperator). Diese Dinge unterscheiden sich nicht sehr von denen, die Sie in JavaScript, PHP oder einer anderen Sprache verwenden. Aber - wie die meisten Ruby - gibt es viel mehr, als hier auffällt.

Hier ist das Geheimnis: Operatoren in Ruby sind wirklich Methodenaufrufe. Versuche dies:

1. + (2) # 3

Hier nennen wir das + Operator für das Objekt 1, in dem Objekt vorbei 2 als Parameter. Wir bekommen das Objekt zurück 3. Das können wir auch mit Strings machen:

name = "Joe" name. + ("Smith") # "Joe Smith", aber "name" ist immer noch "Joe" name + = "Smith" # name ist jetzt "Joe Smith"

Wie Sie sehen, können wir mit dem String eine String-Verkettung durchführen + Methode. Als Bonus definiert Ruby den Operator + = basierend auf dem Operator + (Hinweis: Sie können + = nicht als Methode verwenden.).

Wie Sie vielleicht wissen, gibt uns das unglaubliche Kraft. In unseren benutzerdefinierten Klassen können Sie die Bedeutung von Hinzufügen, Subtrahieren und Zuweisen von Objekten anpassen. Wir haben gesehen, wie dies mit Eigenschaften von Objekten in unserer Unterrichtsstunde funktioniert (wir haben a definiert Eigentum und Eigenschaft = Methode in der Klasse und erhielt den erwarteten Syntaxzucker für deren Verwendung). Was wir hier betrachten, geht noch einen Schritt weiter.


Aufbau eigener Operator-Methoden

Versuchen wir, eine dieser Methoden selbst zu erstellen. In diesem Beispiel erstellen wir ein Kühlschrankobjekt, zu dem wir Dinge hinzufügen können + Betreiber und nehmen Sie die Dinge über die - Operator.

Hier ist der Beginn unserer Klasse:

Klasse Kühlschrank def initialisieren (Getränke = [], Lebensmittel = []) @ Getränke = Getränke @ Foods = Lebensmittel Ende Def + (Element) Ende Def - (Element) Ende

Unsere initialisieren function ist ziemlich einfach: Wir nehmen zwei Parameter (die auf leere Arrays zurückgreifen, wenn nichts angegeben wird) und weisen sie Instanzvariablen zu. Lassen Sie uns nun diese beiden Funktionen erstellen:

def + (item) wenn item.is_a? Beverage @ beverages.push item else @ foods.push item Ende

Das ist ziemlich einfach. Jedes Objekt hat ein ist ein? Methode, die einen einzelnen Parameter verwendet: eine Klasse. Wenn das Objekt eine Instanz dieser Klasse ist, wird true zurückgegeben. Andernfalls wird falsch zurückgegeben. Das heißt also, wenn der Artikel, den wir zum Kühlschrank hinzufügen, a ist Getränk, wir werden es dem hinzufügen @ Getränke Array. Ansonsten fügen wir es dem hinzu @Lebensmittel Array.

Das ist gut; Wie wäre es nun, die Sachen aus dem Kühlschrank zu nehmen? (Hinweis: Diese Methode unterscheidet sich von der im Video gezeigten; dies zeigt Ihnen, dass diese Operatormethode uns sehr viel Flexibilität gibt; es sind wirklich normale Methoden, mit denen Sie alles machen können bessere Version der Methode, jedoch komplexer.)

def - (item) ret = @ beinks.find do | drink | drink.name.downcase == item.downcase end return @ beinks.delete ret, es sei denn ret.nil? ret = @ foods.find do | food | food.name.downcase == item.downcase end @ foods.delete ret end

Was passiert, wenn wir den Minus-Operator verwenden? Der Parameter, den es benötigt, ist eine Zeichenfolge mit dem Namen des gesuchten Elements. (Übrigens, wir erstellen das Getränk und Essen Klassen bald). Wir beginnen mit der Verwendung von finden Methode, die Arrays haben. Es gibt einige Möglichkeiten, diese Methode zu verwenden. wir übergeben es einen Block; Dieser Block sagt, dass wir versuchen, das Element in dem Array zu finden, das eine Name Diese Eigenschaft entspricht der Zeichenfolge, die wir übergeben haben. Beachten Sie, dass wir beide Zeichenfolgen in Kleinbuchstaben konvertieren, um sicher zu sein.

Wenn ein Element im Array übereinstimmt, wird dieses in gespeichert ret; Andernfalls, ret wird sein Null. Als nächstes werden wir das Ergebnis von zurückgeben @ drink.delete ret, Dadurch wird das Element aus dem Array entfernt und zurückgegeben. Beachten Sie, dass wir am Ende dieser Zeile einen Anweisungsmodifizierer verwenden. Dies tun wir es sei denn ret ist Null.

Sie fragen sich vielleicht, warum wir das Keyword verwenden Rückkehr hier, da es in Ruby nicht benötigt wird. Wenn wir es hier nicht verwenden würden, würde die Funktion noch nicht zurückkehren, da die Funktion mehr Code enthält. Verwenden Rückkehr Hier können wir einen Wert von einem Ort zurückgeben, den die Funktion normalerweise nicht zurückgeben würde.

Wenn wir nicht zurückkehren, bedeutet dies, dass der Artikel nicht gefunden wurde @ Getränke. Deshalb gehen wir davon aus, dass es in ist @Lebensmittel. Wir werden das Gleiche tun, um den Artikel in zu finden @Lebensmittel und dann zurückgeben.

Bevor wir das testen, brauchen wir unsere Essen und Getränke Klassen:

class Beverage attr_accessor: name def initialisieren name @name = name @time = Time.now end end Klasse Essen attr_accessor: name def initialisieren name @name = name @time = Time.now end end

Beachten Sie, dass ich im Video nichts gemacht habe @Name von außerhalb des Objekts zugänglich. Hier mache ich das mit attr_accessor: name, So können wir den Namen dieser Objekte überprüfen, wenn sie sich in einem Kühlschrank befinden.

Also testen wir es in irb. Wir beginnen mit der Anforderung der Datei, die den Code enthält. dann probieren Sie die Klassen aus; Beachten Sie, dass ich der Ausgabe Zeilenumbrüche hinzugefügt habe, um das Lesen zu erleichtern.

> erfordern './lesson_6' => true> f = Kühlschrank.new => # > f + Beverage.new ("water") => [#]> f + Food.new ("bread") => [#]> f + Food.new ("Eier") => [#, # ]> f + Beverage.new ("Orangensaft") => [#, # ]> f => #, # ], Lebensmittel [#, # ]> f - "bread" => # > f => #, #], Lebensmittel [#]

Während wir weitergehen, können Sie sehen, dass Dinge hinzugefügt werden @ Getränke und @Lebensmittel Arrays und anschließend entfernt.


Operatoren abrufen und festlegen

Nun schreiben wir Methoden für die mit Hashes verwendeten Get- und Set-Operatoren. Sie haben das schon mal gesehen:

person =  person [: name] = "Joe"

Da diese Operatoren Methoden sind, können wir dies folgendermaßen tun:

Person. [] = (: Alter, 35) # zum Festlegen der Person. [] (: Name) # zum Abrufen

Stimmt; Dies sind normale Methoden mit speziellem Zucker für Ihre Verwendung.

Lass es uns versuchen; wir machen ein Verein Klasse. Unser Club hat Mitglieder mit unterschiedlichen Rollen. Möglicherweise möchten wir jedoch mehr als ein Mitglied mit einer bestimmten Rolle haben. So unser Verein Die Instanz wird die Mitglieder und ihre Rollen mit einem Hash verfolgen. Wenn wir versuchen, ein zweites Mitglied einer Rolle zuzuweisen, anstatt das erste zu überschreiben, fügen wir es hinzu.

class Club def initialize @members =  end def [] (Rolle) @members [Rolle] end def [] = (Rolle, Mitglied) end end

Die Get-Version ist ziemlich einfach. wir leiten es einfach an @ Mitglieder Array. Aber das Set ist etwas komplizierter:

def [] == (Rolle, Mitglied) if @members [Rolle] .nil? @members [role] = member elsif @members [role] .is_a? String @members [role] = [@members [role], member] else @members [role] .push Ende des Members

Wenn diese Rolle nicht festgelegt wurde, setzen wir den Wert dieses Schlüssels einfach auf unseren Member-Hash. Wenn es als Zeichenfolge festgelegt wurde, möchten wir das in ein Array konvertieren und das ursprüngliche Element und das neue Member in dieses Array einfügen. Wenn keine dieser Optionen wahr ist, handelt es sich bereits um ein Array, und wir schieben das Mitglied einfach in das Array. Wir können diese Klasse auf diese Weise testen:

c = Club.new c [: chair] = "Joe" c [: engineer] = "John" c [: engineer] = "Sue" c [: chair] # "Joe" c [: engingeer] # ["John "," Sue "]

Da gehst du hin!


Andere Betreiber

Dies sind natürlich nicht die einzigen Operatoren, mit denen wir dies tun können. Hier ist die ganze Liste:

  • Rechenzeichen: + - * \
  • Operatoren abrufen und festlegen: [] [] =
  • Schaufelbediener: <<
  • Vergleichsoperatoren: == < > <= >=
  • Fallgleichheit Betreiber: ===
  • Bitweiser Operator: | & ^

Danke fürs Lesen!

Wenn Sie Fragen zu dieser Lektion haben oder zu anderen Themen, die wir in Ruby besprochen haben, fragen Sie in den Kommentaren nach!