17 Stimmen

Wie kann ich einen attr_reader dynamisch hinzufügen?

Ich erwarte, dass der folgende Code wie erwartet funktioniert, aber ich erhalte einen NoMethodError (private Methode "foo" aufgerufen für #<MyClass...)

class MyClass
end

my_object = MyClass.new

my_object.instance_variable_set(:@foo, "bar")
MyClass.send("attr_reader", :foo)

puts my_object.foo

Das Problem ist, ich bin mit buchstäblich identischen Code in einer größeren Anwendung und es funktioniert genau wie ich erwarte, aber wenn ich es zu diesem grundlegenden Beispiel vereinfachen es fehlschlägt.

(Ich weiß, dass es viele andere Möglichkeiten gibt, das zu tun, was ich in Ruby tue)

0voto

ComDubh Punkte 728

Ich bin verwirrt über diese, aber eine Lösung, die funktioniert, ist die attribute_reader explizit öffentlich mit MyClass.send(:public, :foo) d.h.

class MyClass
end

my_object = MyClass.new

my_object.instance_variable_set(:@foo, "bar")
MyClass.send(:attr_reader, :foo)
MyClass.send(:public, :foo)

puts my_object.foo

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