代码之家  ›  专栏  ›  技术社区  ›  epochwolf

在Ruby中,为什么nil.id返回4?

  •  35
  • epochwolf  · 技术社区  · 15 年前

    这件事困扰了我好长时间了。

    >> nil.id
    (irb):2: warning: Object#id will be deprecated; use Object#object_id
    => 4
    

    为什么nil.id是4?(或nil.object\u id,如果您想对弃用行为挑剔)

    4 回复  |  直到 15 年前
        1
  •  41
  •   dagvl    15 年前

    这是因为nil是在语言初始化时创建的对象,而该对象的id恰好总是4。

    有关为什么id恰好为4的更多信息,请参阅 this

        2
  •  11
  •   Andrew Peters    15 年前

    我一直以为这是一个很酷的复活节彩蛋:在日本,死亡人数是4。

        3
  •  4
  •   Michiel de Mare    15 年前

    这是因为每个对象的id都必须以某种方式在C Ruby解释器中表示。数字被映射到(数字*2)+1,真实值被映射到0,虚假值被映射到2,零值被映射到4。这只是一个奇怪的实现问题或泄漏的抽象。除非你想写一个Ruby解释器,否则你不应该担心它。

        4
  •  0
  •   Sumit Munot    11 年前

    如果你在irb尝试这个,你会得到4分

    irb
    >> NIL.id
    (irb):7: warning: Object#id will be deprecated; use Object#object_id
    => 4
    

    在ruby中,日本人在nil方法上设置为call,返回4,这是语言标准,他们将4设置为“危险”或“死亡”