加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Ruby变量是否存储值或地址?

发布时间:2020-12-16 22:15:55 所属栏目:百科 来源:网络整理
导读:既然在 Ruby中,一切都是一个对象,做 Ruby变量存储值或地址的立即类型(读取原语)?与存储变量中的值(如果它们是基元)的C相反. 解决方法 注意,以下所有的都是默认的Ruby,它内部使用YARV,又名“另一个Ruby VM”,像JRuby这样的其他rubies可能会使用不同的内部表
既然在 Ruby中,一切都是一个对象,做 Ruby变量存储值或地址的立即类型(读取原语)?与存储变量中的值(如果它们是基元)的C相反.

解决方法

注意,以下所有的都是默认的Ruby,它内部使用YARV,又名“另一个Ruby VM”,像JRuby这样的其他rubies可能会使用不同的内部表示…

好问题.

Ruby使用整数的标记指针,其他所有内容都作为对象的引用进行存储.

他们如何工作?指针中的一位用作标签,如果该位被置位,则指针的其余部分被解释为整数,否则将被解释为地址.

这是因为一个指针中的某些位未被使用.通常不使用内存地址的最低位.大多数系统只允许对齐的存储器地址的地址,例如对齐到4个字节,因此2位可用作标签.然后如果该标签被设置,则指针的另一个31位被解释为整数.

当您查看整数的object_id时,您可以看到这一点

20.to_s(2) # => "10100"
20.object_id.to_s(2) # => "101001"

在某些系统上,使用两个标记位,然后使用其他标记位表示浮点数.还有一些特殊的对象,如nil,true,false,表示为不太可能是有效内存地址的保留号.符号也在内部表示为带标号的整数,但与实际整数不同的位掩码.

所有其他值都表示为指针.

有趣的是,您可以使用ObjectSpace类检查所有这些.

(0..100).each { |n| p([n,ObjectSpace._id2ref(n)]) rescue nil }

在我的系统上打印

[0,false]
[1,0]
[2,2.0]
[3,1]
[5,2]
[6,-2.0]
[7,3]
[8,nil]
[9,4]
[10,2.0000000000000004]
[11,5]
[13,6]
[14,-2.0000000000000004]
[15,7]
[17,8]
[18,2.000000000000001]
[19,9]
[20,true]
[21,10]
[22,-2.000000000000001]
[23,11]
...

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读