Hinzufügen einer Klasseninstanzvariable und Attr_reader zur Ruby -Klasse zur Laufzeit?
-
13-10-2019 - |
Frage
Wie füge ich eine Klasseninstanzvariable, die Daten dafür und einen Attr_reader zur Laufzeit hinzu?
class Module
def additional_data member, data
self.class.send(:define_method, member) {
p "Added method #{member} to #{name}"
}
end
end
Zum Beispiel angesichts dieser Klasse
class Test
additional_data :status, 55
end
So kann ich jetzt anrufen:
p Test.status # => prints 55
Lösung
Wie wäre es damit?
class Object
def self.additional_data(name, value)
ivar_name = "@#{name}"
instance_variable_set(ivar_name, value)
self.class.send(:define_method, name) do
instance_variable_get(ivar_name)
end
self.class.send(:define_method, "#{name}=") do |new_value|
instance_variable_set(ivar_name, new_value)
end
end
end
class Foo
additional_data :bar, 'baz'
end
puts Foo.bar # => 'baz'
Foo.bar = 'quux'
puts Foo.bar # => 'quux'
Es ist ziemlich selbsterklärend, aber lassen Sie mich wissen, ob Sie Fragen haben.
Andere Tipps
Module#class_eval
ist was du willst:
def add_status(cls)
cls.class_eval do
attr_reader :status
end
end
add_status(Test)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow