【问题标题】:Ruby - add constructor to Fixnum and other classesRuby - 将构造函数添加到 Fixnum 和其他类
【发布时间】:2012-08-28 14:54:48
【问题描述】:

在我的last Question 中,我正在寻找一种方法来扩展 Ruby 变量的能力。回答这个问题让我想到了一个新问题。显然,“猴子补丁”解决了这个问题的很大一部分,现在我至少可以用(a = 3).nat 的方式间接地进行打字,其中nat 是“猴子补丁”进入 Fixnum 检查天气“3”的方法是一个有效值。一开始还可以,但仍然有点笨拙和不直观。我最终真正需要的是一种方法来重写,扩展,拦截或重载到Fixnum的构造函数,以便a = 3直接调用方法nat

有没有办法做到这一点?

我不仅对“正确的方式”感兴趣,它可能有点“hacky”。这仅用于我的研究,它可能是一种危险且不受支持的方式。

【问题讨论】:

  • ruby-forum 上关于 Fixnum 的相关讨论:ruby-forum.com/topic/679033
  • Fixnum 实际上没有构造函数——它没有 #new 方法,因为它是一个立即值。

标签: ruby oop metaprogramming fixnum


【解决方案1】:

在您的示例中,未调用构造函数,发生的情况是您通过使用赋值运算符 = 使 a 成为对文字 3 的引用。

您想要的是覆盖在 AFAIK 中不可能的分配。

【讨论】:

  • 啊,我应该先考虑一下 Ruby 是如何工作的——所以是的,覆盖或扩展赋值将是一个很棒的解决方案。但是在分配过程中,Fixnum 类在哪里被调用呢?有没有办法拦截或扩展甚至重定向该呼叫?
  • 您发布的 sn-p 中没有调用。赋值不是方法调用,文字也不是方法调用。
  • 是的,我明白这一点,但是必须有某种机制或功能使“a”指向“Fixnum”。决定文字 3 是 Fixnum 并因此连接到 Fixnum 的东西。不要误会我的意思,我不是在寻找合适或精心设计的解决方案,我只是在寻找任何解决方案,我不介意在最坏的情况下为 Ruby 解释器构建扩展,或者使用一些不稳定的 hack最好的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-20
相关资源
最近更新 更多