In Ruby können Sie Getter/Setter-Methoden erstellen, indem Sie der Klassendefinition Folgendes hinzufügen."attr_reader" für alle Instanzvariablen deklarieren, ohne sie aufzulisten
attr_reader :key1, :key2, :key4
attr_writer :key1, :key2, :key3
oder äquivalent
attr_accessor :key1, :key2, :key3
Zum Beispiel
class Foo
attr_reader :blah, :bar, :foo, :rah, :jar
def initialize a, b, c
@blah = calculate_blah(a,b)
@bar = calculate_bar(a)
@foo = calculate_foo(b,c)
@rah = calculate_rah(a,b,c)
@jar = calculate_jar(a,c)
end
# etc etc
end
Lasst uns sagen, es gibt viele Instanzvariablen, und ich möchte Getter-Methoden auf allen von ihnen.
Ist es möglich, attr_reader
für alle Instanzvariablen zu deklarieren, ohne sie alle aufzulisten?
Der Vorteil ist, dass Sie nicht zwei Listen von Variablen (die identisch sind) eine in der initialize
Methode, eine andere mit attr_reader
pflegen müssen. Wenn Sie später eine weitere Instanzvariable hinzufügen möchten, müssen Sie sie später nur noch in der initialize
-Methode einrichten, ohne sie ebenfalls der Liste attr_reader
hinzufügen zu müssen.
Wenn dies nicht ohne weiteres mit attr_reader
verfügbar ist, könnte vielleicht eine Metaprogrammierung herbeigerufen werden, um zu helfen?
Das Hauptziel hier ist zu verstehen, ob dies in Ruby möglich ist. Die Verwendung von Metaprogrammierung verursacht oft Kosten für Leistung und Unklarheit. Aber das geht über den Rahmen dieser Frage hinaus.
Ich bin mehr daran interessiert zu wissen, ob es möglich ist, etwas zu tun, nicht, ob das das Richtige ist.
Sie ein Array dieser Instanzvariablen Die Namen bekam? –
Instanzvariablen sind vor der Laufzeit nicht vorhanden. Sie werden lebendig, wenn ihnen ein Wert zugewiesen wird. Dies bedeutet, dass verschiedene Instanzen derselben Klasse abhängig von der in ihnen ausgeführten Logik verschiedene Instanzen von Instanzvariablen haben können. Jetzt wo Sie das wissen, an welchem Punkt im Lebenszyklus des Objekts möchten Sie die Methoden erstellen? –
"Vielleicht könnte eine metaprogrammierende Magie helfen" - Ihr genauer Anwendungsfall ist sehr unklar, aber wenn es aus reiner Faulheit heraus ist, dann sollten Sie keine Metaprogrammierung einbeziehen. Eine Klasse mit 100 Ivars ist schlecht genug :) –