2010-09-02 1 views
0
p parent.class #=> NilClass # ok. 
p !!parent # => false # as expected. 
p parent.object_id # => 17006820 # should be 4 
p parent && parent.foo # => NoMethodError foo # should be nil-guarded 

D'où vient cet objet?Qu'est-ce qui s'est passé ici? (néant dans Ruby)

+0

sepp2k peut faire de bonnes suppositions, mais pour l'instant, il n'y a pas de vraie question ici. – theIV

Répondre

2

Peut-être quelque chose comme ceci:

class BlankSlate 
    instance_methods.each do |m| 
    # Undefine all but a few methods. Various implementations leave different 
    # methods behind. 
    undef_method(m) unless m.to_s == "object_id" 
    end 
end 

class Foo < BlankSlate 
    def method_missing(*args) 
    delegate.send(*args) 
    end 

    def delegate 
    # This probably contains an error and returns nil accidentally. 
    nil 
    end 
end 

parent = Foo.new 

p parent.class 
#=> NilClass 

p !!parent 
#=> false 

p parent.object_id 
#=> 2157246780 

p parent && parent.foo 
#=> NoMethodError: undefined method `foo' for nil:NilClass 

Création BlankSlate ou BasicObject est un modèle commun (avant qu'il ne soit ajouté au noyau Ruby de la version 1.9). Il sert à créer des objets qui feront quelque chose de spécial avec n'importe quelle méthode, ou à déléguer fortement leur comportement à une classe différente. L'inconvénient est qu'il peut introduire un comportement étrange comme celui-ci.

+0

Nice. (rdb: 1) p Object.instance_method (: classe) .bind (parent) .call YARD :: StubProxy – Reactormonk

Questions connexes