新手问题 Ruby 如何获取对象的内存地址?

moonhow007 · 2018年12月02日 · 最后由 moonhow007 回复于 2018年12月04日 · 3084 次阅读

小弟初学 Ruby,说实话,资料确实有点少。请教各位大佬 Ruby 如何获取内存地址。比如 Python 有 id() 函数;java 更简单,不重写 toString() 默认打印内存地址;C/C++ 有&;Perl 也有这种类 C 风格指针$pointer=\$variable(虽然语法符号不像 C)。话说 Ruby 不是借鉴了这些语言么(java 除外),不是标榜可以用不同方法做同一件事么?其他语言的语法我试了个遍,反正没卵用。恕我直言仅仅是命令行的退出语法比 Python 多,就说自己的设计哲学是鼓励多种方式解决问题,真心不敢苟同😂

yunshang 回复

非常感谢,xx.object_id 我 get 到了。我用记事本学的,没有用 RubyMine 这类有提示功能的 IDE,一时半会居然懵逼了😁 。在您的带领下我成功入坑了😂

moonhow007 回复

用记事本有什么好处吗😂

moonhow007 回复

可文档上也没说 object_id 一定是内存地址啊

yunshang 回复

记事本乃装 B 专用😀 我起手就来写第一篇 Ruby 笔记:Ruby 和 Python 的默认参数对比
原问题 url:https://blog.csdn.net/vincent2610/article/details/52181853
例子:
Python:

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-

class Food:
    def __init__(self):
        self.name = "banana"


def eat(name, food=Food()):
    print(name + " eat " + food.name + ", id = " + str(id(food)))


if __name__ == "__main__":
    eat("kobe")
    eat("james")

运行结果:
kobe eat banana, id = 2499344982592
james eat banana, id = 2499344982592
[Finished in 0.1s]

Ruby:

#!/usr/bin/env ruby
# -*- coding: UTF-8 -*-

class Food
    attr_accessor :name
    def initialize()  
        @name = "banana"  
    end 
end

def eat(name, food=Food.new)
    puts "#{name} eat #{food.name}, id = #{food.object_id}"
end

eat "kobe" 
eat "james"

运行结果:
kobe eat banana, id = 16460400
james eat banana, id = 16460240

结论:Python 默认参数只能指向不可变对象,一直使用第一次 new 出的那个 obj;Ruby 默认参数指向可变对象,比较符合正常人类思维方式😂

moonhow007 回复

你很有意思

miao 回复

嗯,感谢。可能只是对象在内存的唯一标识符。关于这个问题我初衷只是想看看两个对象是否指向同一内存地址,如果 object_id 相同,那么不论 object_id 是否为内存地址,可否推出“具有相同 object_id 的对象一定指向同一内存地址”?我猜这个推论成立😀

moonhow007 回复

Python 默认参数只能指向不可变对象,一直使用第一次 new 出的那个 obj

第二句对了,第一句错了。

2.3.3 :002 > 'hello world'.__id__
 => 70260779467420
2.3.3 :003 > 'hello world'.__id__
 => 70260779436300
2.3.3 :004 > :hello.__id__
 => 1264988
2.3.3 :005 > :hello.__id__
 => 1264988

这是你需要的吗?

moonhow007 回复

😆 四个空格的缩进看着有点别扭啊。你可以试试 VS Code 或者 Sublime Text这类现代编辑器,记事本应该不太好用啊。

符号在内存中的位置不变,字符串会

zhangkaizhao 回复

嗯,感谢。确实是我表述错误,Python 默认参数当然可以指向可变对象,只是产生的副作用可能不是我需要的而已

lanzhiheng 回复

非常感谢😀 是我需要的

w569893882 回复

感谢,又搞懂个基础问题😀

moonhow007 关闭了讨论。 12月06日 21:28
需要 登录 后方可回复, 如果你还没有账号请 注册新账号