2010-06-18 4 views
1

J'ai une classe Wrapper qui supporte l'ajout d'options que vous pouvez ensuite rechercher plus tard. Il stocke ces options dans un hachage interne @dict.Comment écrire ce `method_missing`?

w = Wrapper.new 
w.foo # => NameError 
w.foo = 10 
w.foo # => 10 

Comment puis-je écrire un method_missing pour Wrapper afin que je puisse soutenir les appels imbriqués sur @dict?

w = Wrapper.new 
w.foo.bar.baz = 1000 
w.foo.bar.baz # => 1000 

Répondre

5

Si ce n'est pas ce que vous recherchez, laissez un commentaire.

class Wrapper 
    def initialize(d={}) 
    @dict = d 
    end 

    def method_missing(method, *args) 
    if method.to_s =~ /=$/ 
     @dict[method.to_s.match(/^(.*)=$/)[1].to_sym] = args.first 
    else 
     @dict[method] ||= Wrapper.new 
    end 
    end 
end 

w = Wrapper.new 
w.foo = 5 
w.foo #=> 5 
w.x.y.z = 32 
w.x.y.w = 43 
w.x.y.z #=> 32 
w.x.y.w #=> 43 
+0

Est-ce que cela prend en charge la demande de chaînage de l'OP? – Jeriko

+1

@Jeriko - Regardez les lignes à la fin. Oui. – Adrian