2

我碰巧正在研究一个Ruby中的Singleton类,并且只记得它在factory_girl中的工作方式。他们解决了这个问题,所以你可以同时使用很长的路Factory.create(...)短路Factory(...)我想到了它,并好奇他们是如何使类Factory也像一个方法行为。ruby​​如何允许一个方法和一个同名的类?

他们只是用Factory两次像这样:

def Factory (args) 
    ... 
end 

class Factory 
    ... 
end 

我的问题是:如何红宝石做到这一点?使用这种看似古怪的模式会有危险吗?

回答

6

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

唯一的问题是当你没有接收器,没有参数和任务。然后,Ruby无法区分无接收者无参数发送和变量之间的差异。因此,它弥补了一些任意的规则,这些规则基本上都是:

  • 开始以小写字母的不明确的标记,更愿意把它解释为一个消息发送,除非你肯定知道它是一个变量(即解析器(非(!)的解释器)已经看到了前一个分配)开始以大写字母的不明确的标记
  • ,宁愿把它解释为一个常数

注意对于用参数发送的消息(甚至是我f参数列表是空的),没有歧义。

  • test():明明是消息发送,这里没有歧义
  • test:可能是消息发送或变量;解决规则说,这是一个消息发送(除非之前已经被分配到test
  • Test():明明消息发送,这里没有歧义
  • self.Test明显的消息发送,在这里没有歧义
  • Test:可能是一个消息发送或常量;分辨率规则说这是一个常数
相关问题