26 Stimmen

Wie man in Ruby dynamisch Accessor-Methoden aufruft

Unabhängig davon, ob es eine gute Praxis ist oder nicht, wie kann ich Accessor-Methoden in Ruby dynamisch aufrufen?

Hier ist eine Beispielklasse:

class Test_Class
  attr_accessor :a, :b
end

Ich kann die Methode Object.send verwenden, um die Variable zu lesen...

instance.a = "value"
puts( instance.send( "a" ) )
# => value

Aber es fällt mir schwer, sie anzuschreiben. Diese werfen "falsche Anzahl von Argumenten (1 für 0) (ArgumentError)"

instance.send("a", "value")

und

instance.method("a").call("value")

Bitte helfen Sie mir StackOverflow!

55voto

Angela Punkte 2894

Ich bin kein Ruby-Experte, aber ich denke, dass Sie das tun können:

instance.send("a=", "value")

0 Stimmen

Funktioniert, großartig! Ich vermute, das Gleichheitszeichen ist Teil des Methodennamens?

0 Stimmen

Ja, das Gleichheitszeichen ist der konventionelle Weg, um Setter-Methoden in Ruby zu definieren. Ich würde allerdings eher ein Symbol als eine Zeichenkette verwenden. instance.send(:a=, "value")

0 Stimmen

Ja. attr_accessor bietet zwei Methoden: def v; @v; end und def v=(value); @v=value; end

11voto

Marcin Urbanski Punkte 2443

Sie können auch direkt auf Instanzvariablen eines Objekts zugreifen, indem Sie instance_variable_* Funktionen:

instance = Test_Class.new                 # => #<Test_Class:0x12b3b84>

# instance variables are lazily created after first use of setter,
# so for now instance variables list is empty:
instance.instance_variables                # => []

instance.instance_variable_set(:@a, 123)   # => 123
instance.a                                 # => 123
instance.instance_variables                # => ["@a"]
instance.instance_variable_get("@a")       # => 123

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X