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

时间:2010-06-06 20:52:37

标签: ruby-on-rails ruby design-patterns programming-languages

我碰巧在ruby中使用Singleton类,只记得它在factory_girl中的工作方式。他们解决了这个问题,所以你可以同时使用漫长的 Factory.create(...)短路 Factory(...)我想到了它并且很想知道如何他们使班级Factory的行为也像一种方法。

他们只是两次使用Factory

def Factory (args)
  ...
end

class Factory
  ...
end

我的问题是: ruby​​如何做到这一点?使用这种看似古怪的模式是否有危险?

1 个答案:

答案 0 :(得分:6)

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

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

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

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

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