首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Open Singleton类中调用Singleton类方法

在Open Singleton类中调用Singleton类方法
EN

Stack Overflow用户
提问于 2019-08-28 21:38:26
回答 2查看 40关注 0票数 4

我试图理解为什么我不能从开放类中调用定义在单例类上的方法,但我可以从实际的类中调用。

有人能解释一下为什么第一个例子失败了,而第二个没有吗?

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 2019-08-28 22:48:59

你的例子比它需要的更令人困惑。它根本不需要单例类:

代码语言:javascript
复制
class Foo
  def bar; end

  bar # NameError
end

Foo.new.bar

在这里,我们有一个具有实例方法bar的类Foo。单例类仍然只是一个类,所以这实际上与您的示例完全相同。

没有显式定义的def定义了最接近的词法封闭类定义的实例方法,在本例中为Foo。没有显式接收者(如bar )的消息发送将消息发送到self。在类定义主体中,self是类本身。

因此,def barFoo中定义了一个实例方法,即可以在Foo的实例上调用的方法。

类定义主体中的barself发送一条消息,即Foo。由于Foo不是其自身的实例,它没有名为bar的方法,因此该方法调用失败。

这与单例类的工作原理完全相同,因为它仍然只是一个类。

票数 2
EN

Stack Overflow用户

发布于 2019-08-28 22:47:40

首先,您对方法所属的位置做出了错误的假设。从类上下文内部对实例方法one的调用不应成功。在第一个片段中,您尝试从One的单例类的单例类中调用方法one (因为它是从singleton_class上下文中调用的)。

使用普通的类/实例方法来阐明的示例:

代码语言:javascript
复制
class One
  def self.one()
    puts :class
  end
  def one
    puts :instance
  end
  one()
end
#⇒ class

因此,预期的行为将是引发NameError。现在答案很简单:它引发NameError,因为这个方法不存在。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57693798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档