Ruby类返回值

Ruby类返回值,ruby,Ruby,我正在学习Ruby并开设了一个课程来帮助: class WhatImDoing def initialize puts "not doing anything" end end 其输出为: not doing anything #<WhatImDoing:0xb74b14e8> 什么都不做 # 我很好奇,第二行是关于什么的?它是我创建的WhatImDoing对象的参考位置吗?我可以通过这个位置访问对象吗(比如指针之类的)?等总的来说,只是想更好地

我正在学习Ruby并开设了一个课程来帮助:

class WhatImDoing
    def initialize
        puts "not doing anything"
    end
end
其输出为:

not doing anything
#<WhatImDoing:0xb74b14e8>
什么都不做
#
我很好奇,第二行是关于什么的?它是我创建的WhatImDoing对象的参考位置吗?我可以通过这个位置访问对象吗(比如指针之类的)?等总的来说,只是想更好地理解Ruby


谢谢。

是的,它是对您正在创建的对象的引用。是的,您可以访问该对象

是的,它是对您正在创建的对象的引用。是的,您可以访问该对象

我假设这是irb的输出。Irb试图打印您的对象,即将其转换为字符串。由于您没有提供自定义to_s(“to string”)方法,因此您的对象继承了此方法:

返回表示obj的字符串。默认为_s打印对象的类和对象id的编码。作为特例,作为Ruby程序初始执行上下文的顶级对象返回“main”


进一步挖掘源代码可以发现,十六进制数实际上是该对象实例占用的内存地址。在Ruby中,对于这些信息,你真的无法做任何花哨的事情。这只是为对象实例生成唯一标识符的一种方便方法。

我假设这是irb的输出。Irb试图打印您的对象,即将其转换为字符串。由于您没有提供自定义to_s(“to string”)方法,因此您的对象继承了此方法:

返回表示obj的字符串。默认为_s打印对象的类和对象id的编码。作为特例,作为Ruby程序初始执行上下文的顶级对象返回“main”


进一步挖掘源代码可以发现,十六进制数实际上是该对象实例占用的内存地址。在Ruby中,对于这些信息,你真的无法做任何花哨的事情。这只是为对象实例生成唯一标识符的一种方便方法。

第二行是
irb
的输出,显示最后一条语句的返回值

如果将某个值设置为该值:

> class WhatImDoing
    def initialize
      puts "not doing anything"
    end

    def ohai
      puts "Ohai"
    end
  end
> tmp = WhatImDoing.new
=> #<WhatImDoing:0x5cd5a2a9>
如果您有一个自定义的
to_s
,它将显示:

> class WhatImDoing
    def to_s
      "#{super} kthxbai"
    end
  endt
> tmp = WhatImDoing.new
=> #<WhatImDoing:0x3e389405> kthxbai 
>上课做什么
def至美国
“#{super}kthxbai”
结束
endt
>tmp=WhatImDoing.new
=>#kthxbai

第二行是
irb
的输出,显示最后一条语句的返回值

如果将某个值设置为该值:

> class WhatImDoing
    def initialize
      puts "not doing anything"
    end

    def ohai
      puts "Ohai"
    end
  end
> tmp = WhatImDoing.new
=> #<WhatImDoing:0x5cd5a2a9>
如果您有一个自定义的
to_s
,它将显示:

> class WhatImDoing
    def to_s
      "#{super} kthxbai"
    end
  endt
> tmp = WhatImDoing.new
=> #<WhatImDoing:0x3e389405> kthxbai 
>上课做什么
def至美国
“#{super}kthxbai”
结束
endt
>tmp=WhatImDoing.new
=>#kthxbai

我忘了提及:我很好奇是否可以通过指向该位置的指针访问它?编辑问题;不要添加问题作为评论。我的回答解释了如何处理价值;Ruby中没有类似的“指针”,而是对对象的引用。我忘了提到:我很好奇是否可以通过指向该位置的指针访问它?编辑问题;不要添加问题作为评论。我的回答解释了如何处理价值;Ruby中没有这样的“指针”,而是对对象的引用(尽管该数字的“含义”取决于实现)。是的,考虑到虚拟内存。它是C中的一个指针值(%p在sprintf中);Ruby实现可以使用任何它希望标识对象“所在”的地方,或者它使用什么作为对该对象的可读解释,等等。对象ID可以只是一个递增索引,例如,它在内部指向映射表。我的观点是,“挖掘源代码”只与一个特定的实现相关,并且在不同的实现中可能会有很大的不同——命名您正在查看的实现很重要,明白了。我考虑的是C语言中的默认引用实现,但我应该对此进行明确说明。(尽管该数字的“含义”取决于实现。)是的,考虑到虚拟内存。它是C中的一个指针值(%p在sprintf中);Ruby实现可以使用任何它希望标识对象“所在”的地方,或者它使用什么作为对该对象的可读解释,等等。对象ID可以只是一个递增索引,例如,它在内部指向映射表。我的观点是,“挖掘源代码”只与一个特定的实现相关,并且在不同的实现中可能会有很大的不同——命名您正在查看的实现很重要,明白了。我在考虑C语言中的默认引用实现,但我本应该对此进行明确说明。