使用代理对象欺骗Ruby的案例运算符===

bhu*_*uga 5 ruby proxy introspection case operators

我正在尝试创建一个代理对象,它几乎将所有方法调用传递给子对象,实质上是委托者模式.在大多数情况下,我只是使用BasicObject并将每个使用method_missing的调用传递给子对象.到现在为止还挺好.

诀窍是尽我所能,我不能欺骗Ruby的case操作符,所以我做不到:

x = Proxy.new(15)
Fixnum === x #=> false, no matter what I do
Run Code Online (Sandbox Code Playgroud)

这当然会使任何case x操作失败,这意味着代理不能安全地传递给其他库.

我不能为我的生活找出===正在使用的东西.代理适用于我所知道的所有基于类的内省,它都正确地传递给子对象:

x.is_a?(Fixnum) #=> true
x.instance_of?(Fixnum) #=> true
x.kind_of?(Fixnum) #=> true
x.class #=> Fixnum
Run Code Online (Sandbox Code Playgroud)

难道Module#===只是在做某种魔力,无法避免?

mka*_*sek 1

是啊,就是。Module#===是用 C 实现的,直接检查对象的类层次结构。看起来没有办法欺骗它。