是否有可能在红宝石中重新定义0?

时间:2014-09-24 20:36:57

标签: ruby monkeypatching fixnum

我实际上不会在任何事情中使用它,以防它确实有效但是可以重新定义0在Ruby中充当1而1充当0吗? FixNum实际上在哪里保持其价值?

2 个答案:

答案 0 :(得分:1)

不,我不这么认为。如果你成功的话,我会非常惊讶。如果你开始重写Fixnum的方法/运算符,你maaaybe可能会接近它(即覆盖+使得1 + 5 => 5,0 + 5 => 6等),但你不会完全替换文字'0 '有价值1.至少编组到本机将暴露Fixnum(0)的实际0值。

老实说,我不确定你是否甚至可以覆盖Fixnum上的+ op等核心操作。这可能会打破很多东西..

据我记得1.8.3源代码,简单的整数和双精度都保存在'值'内,并且被复制到*周围。没有单数“0”,“1”或“1000”值。没有额外的解引用可以让您一次性交换所有值。我怀疑它在1.9中有所改变,我怀疑在2.0中有人对此有任何奇怪的想法。但我实际上并不知道。不过,那会很奇怪。没有平台我知道实习生整数和浮动..字符串,有时是数组文字,但数字?

所以,抱歉,没有#define true false笑话:)

-

来自JörgWMittag 的澄清(谢谢,这正是我所指的):

  

(..)Fixnums在内存中没有位置,它们的指针值是“魔术”(因为它不可能在Ruby程序中出现)并且由运行时系统专门处理。阅读“标记指针表示”,e.g. here

答案 1 :(得分:0)

  

分配不会为Fixnum对象添加别名。对于任何给定的整数值,实际上只有一个Fixnum对象实例,因此,例如,您不能将单例方法添加到Fixnum。任何将单例方法添加到Fixnum对象的尝试都会引发TypeError。 Source

这几乎意味着你无法编辑Fixnum,因此不能在原生ruby中重新定义01

虽然这些Fixnums也是对象,但它们具有唯一的对象id,它可以在内存中的某个位置引用它们。见BasicObject#__id__

如果您可以找到01个对象所在的内存空间并切换它们,那么您应该在ruby中切换01行为。将引用另一个对象。

所以回答你的问题:在Ruby中不可能重新定义Fixnums,但是应该可以切换它们的行为。