(Big edit, j'ai eu une partie du chemin ...) J'ai piraté et je suis venu avec cela comme un moyen de spécifier les choses qui doivent être faites avant les attributs sont lus:Personnalisation de attr_reader pour faire l'instanciation paresseuse des attributs
class Class
def attr_reader(*params)
if block_given?
params.each do |sym|
define_method(sym) do
yield
self.instance_variable_get("@#{sym}")
end
end
else
params.each do |sym|
attr sym
end
end
end
end
class Test
attr_reader :normal
attr_reader(:jp,:nope) { changethings if @nope.nil? }
def initialize
@normal = "Normal"
@jp = "JP"
@done = false
end
def changethings
p "doing"
@jp = "Haha!"
@nope = "poop"
end
end
j = Test.new
p j.normal
p j.jp
Mais changethings
n'est pas reconnue comme une méthode - quelqu'un at-il des idées?
Il ressemble à mon bloc attr_reader est en cours d'exécution dans le cadre de l'objet de classe, plutôt que c'est par exemple. Des idées sur la façon de le forcer à l'instance? –
Vous pouvez utiliser 'instance_eval' à la place de yield, avec block comme paramètre. Mais ça sent un peu. –