相关疑难解决方法(0)

object_id赋值如何工作?

我正在玩Ruby,.object_id并注意到,在irb的几个连续会话中,我得到了相同的结果:

false.object_id // 0
true.object_id // 2
nil.object_id // 4
100.object_id // 201
Run Code Online (Sandbox Code Playgroud)

实际上,每个整数的object_id似乎都是((value*2)+ 1).

另一方面,在退出并重新运行irb之后,给定字符串的object_id永远不会相同.

这为我提出了几个问题:

  1. 是否有已知的方案object_id确定某些s?其他人基本上是随机的
  2. true,false和nil的id不是顺序的.有没有办法询问给定id表示的对象是什么?(我很好奇其他一位数和ids的关系.)
  3. 你可以(不是你应该)编写模糊的Ruby,你使用已知的对象id引用对象而不命名它们,比如"id 201的对象+ id为19的对象"意味着"100 + 9"?

更新

使用Andrew Grimm的建议,我尝试发现其他"低id"对象,但发现:

  • 在这个序列中似乎没有任何更多的偶数对象 - ids 6,8,10等不指向任何东西.
  • 正如我之前的实验所暗示的那样,所有奇数编号的id都属于数字.具体地,id 1指向数字0,3指向1,5指向2,依此类推.

ruby internals

43
推荐指数
2
解决办法
1万
查看次数

一些`Fixnum`属性

Fixnumdoc中找到了以下功能.

Fixnum对象具有直接价值.这意味着当它们作为参数分配或传递时,将传递实际对象,而不是对该对象的引用.

可以在IRB中显示相同的内容吗?希望只有我能正确理解它?

赋值不会为Fixnum对象添加别名.

它究竟是什么呢?

对于任何给定的整数值,实际上只有一个Fixnum对象实例,因此,例如,您不能将单个方法添加到a Fixnum.

无法理解不在对象实例中添加singleton方法的原因Fixnum.

我尝试了第二点,如下所示:

a = 1                      # => 1
a.class                    # => Fixnum
b = a                      # => 1
b.class                    # => Fixnum
a == b                     # => true
a.equal? b                 # => true
a.object_id == b.object_id # => true
Run Code Online (Sandbox Code Playgroud)

但我仍然感到困惑.任何人都可以帮我在这里了解这些功能的核心吗?

ruby

2
推荐指数
1
解决办法
706
查看次数

标签 统计

ruby ×2

internals ×1