Wie setze ich einen attr_accessor für eine dynamische Instanzvariable?
Ich dynamisch erstellt eine Instanz-variable in meiner Klasse:
class Mine
attr_accessor :some_var
def intialize
@some_var = true
end
def my_number num
self.instance_variable_set "@my_#{num}", num
end
end
Wie mache ich @my_#{num}
jetzt als ein attr-Wert?
z.B. ich möchte in der Lage sein, dies zu tun:
dude = Mine.new
dude.my_number 1
dude.my_1
=> 1
InformationsquelleAutor der Frage eywu | 2011-02-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
diese Antwort nicht verpestet die Klasse Raum, Beispiel.. wenn ich
mine.my_number 4
dann die anderen Instanzen derMine
werden nicht diemy_4
Methode.. dies geschieht, weil wir die singleton-Klasse des Objekts statt der Klasse.InformationsquelleAutor der Antwort Orlando
Dies kann erreicht werden, mit
__send__
. Hier:InformationsquelleAutor der Antwort Dorkus Prime
Einfach. Sie können dynamisch zu definieren, die das Attribut reader innerhalb der my_number Methode:
sehen, ob das funktioniert für Sie
InformationsquelleAutor der Antwort Gerry
Gibt es ein problem mit der zwei Methoden hier... wenn eine Instanz-variable festgelegt ist, in eine Instanz, seine accessor verfügbar sein wird, um alle Instanzen, denn du bist die Definition von Methoden auf
self.class
statt auf sich selbst.Was Sie wahrscheinlich tun möchten, ist ändern Sie nur die Instanz, die die Instanz-variable:
Diese Weise Instanz-Variablen nur get-accessors auf die Objekte, die Sie für erstellt wurden. Ich habe auch nicht die Mühe mit instance_variable_set, denn wenn Sie die Einstellung ein accessor, dann denke ich, es liest sich besser, um Sie einfach wiederverwenden. Aber das ist ein Stil nennen. Die große Sache hier ist der Aufruf
class << self
stattself.class
.InformationsquelleAutor der Antwort carpeliam
Den Sie verwenden möchten, können OpenStruct:
Ich weiß nicht, warum Sie würde wollen, dass
dude.my_1
zu 1 zurück - ist das nicht, geben Sie zurück, was Sie bereits haben?InformationsquelleAutor der Antwort Andrew Grimm
älterer thread, aber ich fand es hilfreich, vielen Dank. Hier ist der code, Dorkus Prime Antwort, sondern auch die Instanz vars " von " - Namen\Werte in einem hash
InformationsquelleAutor der Antwort chollaball
Noch eine weitere Lösung hinzufügen, um den Haufen,
define_singleton_method
:Einer Nebenwirkung all dieser Lösungen ist, dass, wenn Sie nennen es mehrfach mit verschiedenen zahlen, Sie am Ende mit einem Bündel von Methoden auf dem Objekt:
Wir können dieses Problem beheben, durch das entfernen der alten Methode:
InformationsquelleAutor der Antwort lobati