ruby如何允许方法和具有相同名称的类?

我碰巧在Ruby中使用Singleton类,只记得它在factory_girl中的工作方式。 他们解决了这个问题所以你可以使用很长的方式 Factory.create(...)简短的 Factory(...)我想到它并且好奇地看到它们如何使类Factory也表现得像一个方法。

他们只是简单地使用Factory两次:

 def Factory (args) ... end class Factory ... end 

我的问题是: ruby如何实现这一目标? 使用这种看似古怪的模式有危险吗?

方法和变量存在于不同的命名空间中。 因此,您可以使用相同名称的方法和变量(或者在本例中为常量)。 但是,在使用它们时,Ruby需要能够区分它们。 一般来说,这不是问题:消息有接收器,变量没有。 消息有参数,变量没有。 变量分配给,消息不分配。

唯一的问题是你没有接收器,没有参数和没有任务。 然后,Ruby无法区分无参数的无接收消息与变量之间的区别。 所以,它必须构成一些任意规则,这些规则基本上是:

  • 对于以小写字母开头的模糊标记,更喜欢将其解释为消息发送, 除非您肯定知道它是变量(即解析器 (不是(!)解释器)之前已经看过一个赋值)
  • 对于以大写字母开头的模糊标记,更喜欢将其解释为常量

请注意,对于带参数的消息发送(即使参数列表为空),也没有歧义。

  • test() :显然是一条消息发送,这里没有歧义
  • test :可能是消息发送或变量; 解决规则说它是一个消息发送(除非之前有一个要test的分配)
  • Test() :显然是一条消息发送,这里没有歧义
  • self.Test :显然也是一个消息发送,这里没有歧义
  • Test :可能是消息发送或常量; 决议规则说这是一个常数