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

Dan*_*ley 2 ruby design-patterns programming-languages ruby-on-rails

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

他们只是这样使用了Factory两次:

def Factory (args)
  ...
end

class Factory
  ...
end
Run Code Online (Sandbox Code Playgroud)

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

Jör*_*tag 6

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

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

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

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

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