我试图做一个代理对象,几乎所有的方法调用转移到子对象,本质上是委托人模式。大多数情况下,我只是使用BasicObject,并将每个调用与method_missing传递给子对象。到现在为止还挺好。愚弄Ruby的大小写运算符===,与代理对象
诀窍是,尽量为我可能,我不能欺骗Ruby的情况下操作,所以我不能做:
x = Proxy.new(15)
Fixnum === x #=> false, no matter what I do
这当然使得任何case x
操作失败,这意味着代理可以不会安全地交给其他图书馆。
我不能为我的生活弄清楚===正在使用什么。
x.is_a?(Fixnum) #=> true
x.instance_of?(Fixnum) #=> true
x.kind_of?(Fixnum) #=> true
x.class #=> Fixnum
是Module#===
只是在做某种神奇的是无法避免的:代理所有基于类的自省,我知道的,这是所有正确地传递到子对象的正常工作?
一句警告:如果您可以通过委派'is_a?','instance_of?','kind_of?','class'等代码将代理伪装为'Fixnum',就可以实现目标!改变这些方法可能会导致你(或者使用/维护你的代码的人)直接调试地狱。 – molf 2010-08-20 07:07:38