【发布时间】:2011-04-01 11:37:46
【问题描述】:
我正在尝试创建一个代理对象,它将几乎所有的方法调用都转移到一个子对象,本质上是委托人模式。在大多数情况下,我只是使用 BasicObject 并将带有 method_missing 的每个调用传递给子对象。到目前为止,一切顺利。
诀窍是尽我所能,我无法欺骗 Ruby 的 case 运算符,所以我做不到:
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,请执行所以!更改这些方法可能会导致您(或使用/维护您的代码的人)直接陷入调试困境。
标签: ruby proxy operators case introspection