ruby - 用代理对象愚弄 Ruby 的 case 运算符 ===

标签 ruby proxy operators case introspection

我正在尝试制作一个代理对象,它将几乎所有方法调用都转移到一个子对象,本质上是委托(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/

相关文章:

ruby-on-rails - 仅在创建时验证方法调用,而不是在更新时调用

ruby - 如何让本地代理服务器将 html 返回到浏览器?

apache - 如何使用 apache 2.2 创建代理?

xcode - iAd Banner 不出现但代码和权利

php - 这个声明是什么意思?

Java 运算符优先级

ruby - 在 raspbian 上使用破折号时出错

java - 如何捕获 Marathon 中的弹出对话框?

mysql - 如何在日期中使用大于运算符?

Ruby 脚本从特定的行或方法开始