Ich habe eine Klasse, die einige private Attribute enthält. Was ich tun möchte, ist, einige Setter für diese dynamisch nur für die Ausführung eines bestimmten Blocks hinzuzufügen.Erweitern für einen Block Anruf nur
Beispiel von dem, was Ich mag sein wäre in der Lage:
class Content
attr_reader :a, :b
def initialize
@a = 1
@b = "plop"
end
def set(&block)
extend(Setter)
instance_eval(&block)
unextend(Setter) ????
end
module Setter
def a(value)
@a = value
end
def b(value)
@b = value
end
end
end
content = Content.new
content.set do
a 2
b "yeah!"
end
content.a # should return 2
EDIT: Vielen Dank für die großen Antworten so weit. Ich klärte die Frage, weil ich tatsächlich Attributleser in der Klasse selbst definieren muss, die mit den im Modul definierten Settlern in Konflikt geraten können. Ich habe diesen Teil vergessen, als ich die Frage gepostet habe. (Es war spät ^^)
CLARIFICATION: Diese Klasse ist für eine DSL gedacht, um eine Konfigurationsdatei zu schreiben. Es richtet sich an Nicht-Entwickler, also je weniger Betreiber, desto besser.
Ich implementiere dies derzeit mit einer Proxy-Klasse, die instance_eval
den Block, aber ich habe mit instance_variable_set
zu verwirren, um die Werte einzustellen und ich mag es nicht. Ich versuche nur einen anderen Weg, um zu sehen, ob ich meinen Code lesbarer machen kann.
Gibt es einen Grund, warum Sie benutzerdefinierte Schriftsteller gerade schreiben , anstatt attr_writer zu verwenden, um sie für dich zu generieren? – rampion