gpt4 book ai didi

ruby - 'NilClass'单例实例在哪里实例化?

转载 作者:数据小太阳 更新时间:2023-10-29 08:25:54 26 4
gpt4 key购买 nike

我想知道 nil 单例对象在 Ruby 源代码中的何处被实例化。

有什么想法吗?

最佳答案

如果我们查看 Github 上的 Ruby 源代码,我们可以看到大部分内核功能都在 InitVM_Object 中初始化。 .然而,nil 明显不存在,唯一存在的线索是

/*
* An obsolete alias of +nil+
*/
rb_define_global_const("NIL", Qnil);

诚然,我实际上并不知道 NIL 甚至可以在 Ruby 中工作,但这不是重点。现在我们知道,在 Ruby 的 C 代码中,Qnil 是我们的“nil”对象。事实证明,我们可以将其追溯到 的起源,在 ruby.h 中. Qnil 不是变量;这是一个 #define 编译指示。

#define Qnil RUBY_Qnil

RUBY_Qnil 另一方面,被定义为枚举常量。

enum ruby_special_consts {
RUBY_Qfalse = 0x00, /* ...0000 0000 */
RUBY_Qtrue = 0x14, /* ...0001 0100 */
RUBY_Qnil = 0x08, /* ...0000 1000 */
...
}

所以看起来 nil 只是 Ruby 中一个幸福的谎言。它甚至根本不是一个真实的对象;这只是一个特殊的魔法数字。 truefalse 也在同一个枚举中定义。事实上,我们可以检查 Ruby 本身是否准确。

irb(main):009:0> false.object_id
=> 0
irb(main):010:0> true.object_id
=> 20
irb(main):011:0> nil.object_id
=> 8

falsetruenil 的标识符都等于*我们在枚举中找到的值,所以看起来像这样。

值得注意的是,虽然 nil 本身在 VM 中是一个幸福的谎言,但 nil 上的方法当然是非常真实的。 NilClassInitVM_Object 中定义,它的方法也是如此。但 nil 本身从未被初始化

* 从技术上讲,您的值可能不同。此处列出的枚举值受 #if USE_FLONUM block 保护,该 block 的设置或取消设置取决于系统上各种常量的大小。您可以在 ruby.h 中查看该标志的标准以及其他几个类似的标准。 .

关于ruby - 'NilClass'单例实例在哪里实例化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51384887/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com