n-6ren">
gpt4 book ai didi

ruby - `self` 如何在 ruby​​ 的嵌套方法中工作?

转载 作者:数据小太阳 更新时间:2023-10-29 08:32:52 25 4
gpt4 key购买 nike

要查看谁在 嵌套方法 中扮演 self 的角色,我尝试了以下代码:

def test
p "#{self}"
def show
p "#{self}"
end
end
# => nil

结果,我得到了以下两个对象:

Object.new.test
"#<Object:0x00000002212d78>"
# => nil
Object.new.test.show
"#<Object:0x00000002205330>" #<~~~ this is self understood
"" #<~~~ how this one came?
# => ""

但是从编码的数字中,我无法理解这些对象属于哪个类。我尝试了下面的代码并获得了相应的 class 名称。

Object.new.test.class
"#<Object:0x000000021ff3b8>"
# => NilClass
Object.new.test.show.class
"#<Object:0x000000020660b0>"
""
# => String

那么谁能帮我理解上面的代码是如何产生那些 class 名称的概念?

编辑

这里我试着用更具体的方式问我的问题:

def test
p "First level # => #{self}"
def show
p "Second level # => #{self}"
end
end
# => nil
Object.new.test.show
"First level # => #<Object:0x000000014a77b0>"
"Second level # => "
# => "Second level # => "
Object.new.test.show.class
"First level # => #<Object:0x0000000130ef70>"
"Second level # => "
# => String

为什么 p "Second level # => #{self}" 语句 self"" 值?

最佳答案

Object.new.test.show 调用 Object.new.test 对象中的 show 方法。

Object.new.test 返回 nil(因为 p 返回 nil),但同时它将 show 方法的定义添加到 Object 类。

由于 nil 属于 NilClass 类,而 NilClass 是 Object 的子类,nil 现在已作为方法显示,因此您实际上可以在 nil 中调用 show。

当你做 Object.new.test.show 等同于做

nil.show

当在 show 中执行 p "#{self}"时,实际上是在打印 nil.to_s

nil.to_s is ""

这就解释了您看到的那个神秘的“”。

关于ruby - `self` 如何在 ruby​​ 的嵌套方法中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15096016/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com