我正在尝试制作一个代理对象,它将几乎所有方法调用都转移到一个子对象,本质上是委托(delegate)人模式。在大多数情况下,我只是使用 BasicObject 并将每次使用 method_missing 的调用传递给子对象。到目前为止,还不错。
诀窍是尽我所能,我无法欺骗 Ruby 的 case 运算符,所以我不能这样做:
x = Proxy.new(15)
Fixnum === x #=> false, no matter what I do
这当然会使任何 case x
操作失败,这意味着无法将代理安全地移交给其他库。
我这辈子都搞不懂 === 在用什么。该代理适用于我所知道的所有基于类的内省(introspection),这些内省(introspection)都已正确传递给子对象:
x.is_a?(Fixnum) #=> true
x.instance_of?(Fixnum) #=> true
x.kind_of?(Fixnum) #=> true
x.class #=> Fixnum
Module#===
只是在施展某种无法避免的魔法吗?
最佳答案
是的,是的。 Module#===
在 C 中实现,直接检查对象的类层次结构。看起来没有办法骗过它。
关于ruby - 用代理对象愚弄 Ruby 的 case 运算符 ===,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3528129/