Project1

标题: Ruby的object_id相同意味着什么? [打印本页]

作者: 喵呜喵5    时间: 2014-7-12 00:32
标题: Ruby的object_id相同意味着什么?
在帮助文档中看到了这样的代码:
  1. ary = Array.new(3, "foo")
  2. ary.each {|obj| p obj.object_id }
  3. # => 537774036
  4.      537774036
  5.      537774036

  6. ary = Array.new(3) { "foo" }
  7. ary.each {|obj| p obj.object_id }
  8. # => 537770448
  9.      537770436
  10.      537770424
复制代码
前一种方法中生成的数组的所有元素object_id都是相同的,所以想问一下相同的object_id究竟意味着什么?修改对应元素的值以后拥有相同object_id的其他元素会跟着改变吗?
作者: 菜鸟飞呀飞    时间: 2014-7-12 03:08
提示: 作者被禁止或删除 内容自动屏蔽
作者: taroxd    时间: 2014-7-12 06:32
本帖最后由 taroxd 于 2014-7-12 06:37 编辑



表明他们指向的是同一个对象

对于不可能改变(比如true,false,nil,Fixnum,Symbol等)或者你不会去改变的东西,用第一种做法没有任何问题。
但是如果你要改变一个对象的内部状态,如上图中的 arr[0][0] = 'o' ,或者由数组构成的数组的话,那么结果也会和上图一样。

作者: 无脑之人    时间: 2014-7-12 08:15
object_id对于那些true/falde/nil/Numeric/Symbol来说更像是值,而对于其他对象来说更像一个地址
你用Array.new产生的,相当于三个指向同一字符串对象的指针,那么你修改其中任何一个,都会导致最终对象的改变,从表现来看就是三个对象都改变了
作者: 喵呜喵5    时间: 2014-7-12 11:15
@无脑之人 @taroxd @菜鸟飞呀飞

谢谢,就是说object_id类似于指针?
那么object_id能不能实现指针的相关功能呢?比如获取某个object_id对应的对象并对其操作……

另外除了这种数组的创建方式外还有其他方式也会导致对象的object_id完全相同吗?
作者: taroxd    时间: 2014-7-12 14:51
本帖最后由 taroxd 于 2014-7-12 15:38 编辑
喵呜喵5 发表于 2014-7-12 11:15
@无脑之人 @taroxd @菜鸟飞呀飞

谢谢,就是说object_id类似于指针?


1. 赋值肯定导致 object_id 相同。赋值其实就是传一个指针啦。还有就是立即值的 object_id 相同呗。
另外,Hash的固定默认值(非default_proc)会导致 object_id 相同。至于别的么……查Ruby文档呗。
2. 解引用:ObjectSpace._id2ref(object_id)




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1