Computerwissenschaften

Verwenden von Attributen mit Ruby-Code

Schauen Sie sich einen  objektorientierten Code an,  und alles folgt mehr oder weniger demselben Muster. Erstellen Sie ein Objekt, rufen Sie einige Methoden für dieses Objekt auf und greifen Sie auf Attribute dieses Objekts zu. Es gibt nicht viel anderes, was Sie mit einem Objekt tun können, als es als Parameter an die Methode eines anderen Objekts zu übergeben. Aber hier geht es um Attribute.

Attribute sind wie  Instanzvariablen, auf die  Sie über die Objektpunktnotation zugreifen können. Zum Beispiel   würde person.name auf den Namen einer Person zugreifen. Ebenso können Sie häufig Attribute wie person.name=“Alice“ zuweisen  . Dies ist eine ähnliche Funktion wie Mitgliedsvariablen (wie in C ++), jedoch nicht ganz dieselbe. Hier ist nichts Besonderes los. Attribute werden in den meisten Sprachen mithilfe von „getters“ und „setters“ oder Methoden implementiert, mit denen die Attribute aus Instanzvariablen abgerufen und festgelegt werden.

Ruby unterscheidet nicht zwischen Attribut-Gettern und -Setzern und normalen Methoden. Aufgrund der flexiblen Methode zum Aufrufen der Syntax von Ruby muss keine Unterscheidung getroffen werden. Zum Beispiel sind  person.name  und  person.name ()  dasselbe. Sie rufen die  name-  Methode mit Nullparametern auf. Einer sieht aus wie ein Methodenaufruf und der andere wie ein Attribut, aber beide sind wirklich dasselbe. Sie rufen beide nur die  Namensmethode auf  . Ebenso kann jeder Methodenname, der mit einem Gleichheitszeichen (=) endet, in einer Zuweisung verwendet werden. Die Anweisung  person.name=“Alice“  ist wirklich dasselbe wie  person.name=(alice) , obwohl zwischen dem Attributnamen und dem Gleichheitszeichen ein Leerzeichen steht, ruft sie immer noch nur die   Methode name=auf .

01 von 03

Attribute selbst implementieren

Andreas Larsson / Folio Images / Getty Images

Sie können Attribute einfach selbst implementieren. Durch Definieren von Setter- und Getter-Methoden können Sie jedes gewünschte Attribut implementieren. Hier einige Beispiel – Code der Implementierung Name – Attribut für eine Person – Klasse. Der Name wird in einer @ name- Instanzvariablen gespeichert , der Name muss jedoch nicht identisch sein. Denken Sie daran, dass diese Methoden nichts Besonderes sind.

 #!/usr/bin/env ruby class Person def initialize(name) @name=name end def name @name end def name=(name) @name=name end def say_hello puts "Hello, #{@name}" end end 

Eine Sache, die Sie sofort bemerken werden, ist, dass dies eine Menge Arbeit ist. Es wird viel getippt, nur um zu sagen, dass Sie ein Attribut namens name möchten , das auf die Instanzvariable @name zugreift . Glücklicherweise bietet Ruby einige praktische Methoden, die diese Methoden für Sie definieren.

02 von 03

Verwenden von attr_reader, attr_writer und attr_accessor

In der Module-  Klasse gibt es drei Methoden  , die Sie in Ihren Klassendeklarationen verwenden können. Denken Sie daran, dass Ruby nicht zwischen Laufzeit und „Kompilierungszeit“ unterscheidet und jeder Code in Klassendeklarationen nicht nur Methoden definieren, sondern auch Methoden aufrufen kann. Durch Aufrufen der   Methoden attr_reader, attr_writer und attr_accessor werden wiederum die Setter und Getter definiert, die wir im vorherigen Abschnitt selbst definiert haben.

Die  attr_reader-  Methode mag genau das, wie es sich anhört. Es werden beliebig viele Symbolparameter verwendet und für jeden Parameter eine „Getter“ -Methode definiert, die die gleichnamige Instanzvariable zurückgibt. Daher können wir unsere Namensmethode  im vorherigen Beispiel durch  attr_reader: name ersetzen  .

In ähnlicher  Weise definiert die  attr_writer- Methode eine „Setter“ -Methode für jedes an sie übergebene Symbol. Beachten Sie, dass das Gleichheitszeichen nicht Teil des Symbols sein muss, sondern nur der Attributname. Wir können die   Methode name = aus dem vorherigen Beispiel durch einen Aufruf von  attr_writier: name ersetzen .

Und wie erwartet  erledigt attr_accessor  die Arbeit von  attr_writer  und  attr_reader . Wenn Sie sowohl einen Setter als auch einen Getter für ein Attribut benötigen, ist es üblich, die beiden Methoden nicht separat aufzurufen, sondern stattdessen  attr_accessor aufzurufen . Wir konnten ersetzen  sowohl  den  Namen  und  name =  Methoden aus dem vorherigen Beispiel mit einem einzigen Aufruf  attr_accessor: Name .

#!/usr/bin/env ruby def person attr_accessor :name def initialize(name) @name=name end def say_hello puts "Hello, #{@name}" end end

03 von 03

Warum Setter und Getter manuell definieren?

Warum sollten Sie Setter manuell definieren? Warum nicht  jedes Mal die  attr_ * -Methoden verwenden? Weil sie die Kapselung brechen. Die Kapselung ist das Prinzip, das besagt, dass keine externe Entität uneingeschränkten Zugriff auf den internen Status Ihrer  Objekte haben soll. Auf alles sollte über eine Schnittstelle zugegriffen werden, die verhindert, dass der Benutzer den internen Status des Objekts beschädigt. Mit den oben beschriebenen Methoden haben wir ein großes Loch in unsere Kapselungswand gestanzt und zugelassen, dass für einen Namen absolut alles festgelegt werden kann, auch offensichtlich ungültige Namen.

Eine Sache, die Sie häufig sehen werden, ist, dass  attr_reader verwendet  wird, um schnell einen Getter zu definieren, aber ein benutzerdefinierter Setter wird definiert, da der interne Status des Objekts häufig  direkt aus dem internen Status gelesen werden möchte  . Der Setter wird dann manuell definiert und prüft, ob der eingestellte Wert sinnvoll ist. Oder vielleicht häufiger ist überhaupt kein Setter definiert. Die anderen Methoden in der Klassenfunktion setzen die Instanzvariable hinter dem Getter auf andere Weise.

Wir können jetzt ein hinzufügen  Alter  und richtig ein implementieren  Name –  Attribut. Das  age-  Attribut kann in der Konstruktormethode festgelegt, mit dem age  getter gelesen,  aber nur mit der  have_birthday-  Methode bearbeitet werden, wodurch das Alter erhöht wird. Das  name-  Attribut hat einen normalen Getter, aber der Setter stellt sicher, dass der Name groß geschrieben wird und die Form “  Vorname Nachname“ hat .

#!/usr/bin/env ruby class Person def initialize(name, age) self.name=name @age=age end attr_reader :name, :age def name=(new_name) if new_name =~ /^[A-Z][a-z]+ [A-Z][a-z]+$/ @name=new_name else puts "'#{new_name}' is not a valid name!" end end def have_birthday puts "Happy birthday #{@name}!" @age += 1 end def whoami puts "You are #{@name}, age #{@age}" end end p=Person.new("Alice Smith", 23) # Who am I? p.whoami # She got married p.name="Alice Brown" # She tried to become an eccentric musician p.name="A" # But failed # She got a bit older p.have_birthday # Who am I again? p.whoami

Similar Posts

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.