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.
sepp2k peut faire de bonnes suppositions, mais pour l'instant, il n'y a pas de vraie question ici. – theIV