gpt4 book ai didi

ruby - 在单例类上定义的方法中 self 的值

转载 作者:太空宇宙 更新时间:2023-11-03 18:17:54 27 4
gpt4 key购买 nike

为什么self,在单例类上定义的方法(singleton2)中,不像其他三种情况那样等于那个单例类?

    class A
def self.singleton1
class << self
self
end
end

class << self
def singleton2
self
end
end
end

def singleton3
class << A
self
end
end

p [A.singleton1, A.singleton1.object_id] # [#<Class:A>, 70003841656620]
p [A.singleton2, A.singleton2.object_id] # [A, 70003841656640]
p [singleton3, singleton3.object_id] # [#<Class:A>, 70003841656620]
p [A.singleton_class, A.singleton_class.object_id] # [#<Class:A>, 70003841656620]

最佳答案

我会逐个解释。

 def self.singleton1
class << self
self
end
end

在这里,self方法内部是 A .现在在方法中您正在创建另一个范围,这是 A 的单例类的范围。 , 使用 class << self .和 self当您调用 A.singeton1 时,正在返回单例类的, 作为 selfA 的单例类中是方法的最后一条语句 singleton1 .

class << self
def singleton2
self
end
end

在这里,selfA 的单例类体内是 单例类 本身。现在你定义了一个单例方法 singleton2上课A .在方法内部,最后一个表达式是 self ,它总是会被设置为 receiver , 这是 A .还有一件事,def singleton2创建一个新范围,它不同于 A 的单例类范围.

根据上面的解释,我希望下面的代码输出对你来说一定很清楚:-

class A
def self.singleton1
class << self
self
end
end

class << self
def singleton2
self
end
end
end

A.singleton2 # => A
A.singleton1 # => #<Class:A>

输出 A#<Class:A>清楚地说,为什么 object_id s 是不同的。

从上面2个解释,很清楚singleton3是怎么回事了.

关于ruby - 在单例类上定义的方法中 self 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23272063/

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