我试图理解为什么我不能从开放类中调用定义在单例类上的方法,但我可以从实际的类中调用。
有人能解释一下为什么第一个例子失败了,而第二个没有吗?
class One
class << self
def one; end
one
end
end
NameError (undefined local variable or method 'one' for #<Class:One>)
class Two
class << self
def one; end
end
self.one
end
=> nil发布于 2019-08-28 22:48:59
你的例子比它需要的更令人困惑。它根本不需要单例类:
class Foo
def bar; end
bar # NameError
end
Foo.new.bar在这里,我们有一个具有实例方法bar的类Foo。单例类仍然只是一个类,所以这实际上与您的示例完全相同。
没有显式定义的def定义了最接近的词法封闭类定义的实例方法,在本例中为Foo。没有显式接收者(如bar )的消息发送将消息发送到self。在类定义主体中,self是类本身。
因此,def bar在Foo中定义了一个实例方法,即可以在Foo的实例上调用的方法。
类定义主体中的bar向self发送一条消息,即Foo。由于Foo不是其自身的实例,它没有名为bar的方法,因此该方法调用失败。
这与单例类的工作原理完全相同,因为它仍然只是一个类。
发布于 2019-08-28 22:47:40
首先,您对方法所属的位置做出了错误的假设。从类上下文内部对实例方法one的调用不应成功。在第一个片段中,您尝试从One的单例类的单例类中调用方法one (因为它是从singleton_class上下文中调用的)。
使用普通的类/实例方法来阐明的示例:
class One
def self.one()
puts :class
end
def one
puts :instance
end
one()
end
#⇒ class因此,预期的行为将是引发NameError。现在答案很简单:它引发NameError,因为这个方法不存在。
https://stackoverflow.com/questions/57693798
复制相似问题