1

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

4

2 回答 2

1

不,我不这么认为。如果你能做到,我会非常惊讶。如果您开始覆盖 Fixnum 的方法/运算符,您可能会接近它(即覆盖 + 以使 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örg W Mittag的澄清(谢谢,这正是我所指的):

(..) Fixnums 在内存中没有位置,它们的指针值是“神奇的”(因为它不可能出现在 Ruby 程序中)并由运行时系统进行特殊处理。阅读“标记指针表示”,例如这里

于 2014-09-24T20:46:36.680 回答
0

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

这几乎意味着您无法编辑 Fixnum ,因此无法重新定义01使用原生 ruby​​。

尽管这些 Fixnum 也是对象,但它们具有唯一的对象 ID,可以清楚地在内存中的某个位置引用它们。请参见BasicObject#__id__

如果您可以找到对象所在的内存空间01切换它们,那么您应该在 ruby​​ 中进行有效的切换01行为,因为现在任何一个都将引用另一个对象。

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

于 2014-09-24T23:26:49.533 回答