Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails ruby如何允许方法和类具有相同的名称?_Ruby On Rails_Ruby_Design Patterns_Programming Languages - Fatal编程技术网

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

Ruby on rails ruby如何允许方法和类具有相同的名称?,ruby-on-rails,ruby,design-patterns,programming-languages,Ruby On Rails,Ruby,Design Patterns,Programming Languages,我碰巧正在用ruby编写一个单例类,我刚刚想起了它在ruby中的工作方式。他们解决了这个问题,这样你就可以同时使用长程工厂。创建(…)和短程工厂(…)我想了想,很好奇他们是如何让类工厂也像一个方法一样工作的 他们简单地使用了工厂两次,如下所示: def Factory (args) ... end class Factory ... end 我的问题是:ruby是如何做到这一点的?使用这种看似古怪的模式有危险吗?方法和变量存在于不同的名称空间中。因此,您可以使用相同名称的方法和变量(

我碰巧正在用ruby编写一个单例类,我刚刚想起了它在ruby中的工作方式。他们解决了这个问题,这样你就可以同时使用长程工厂。创建(…)和短程工厂(…)我想了想,很好奇他们是如何让类
工厂也像一个方法一样工作的

他们简单地使用了
工厂
两次,如下所示:

def Factory (args)
  ...
end

class Factory
  ...
end

我的问题是:ruby是如何做到这一点的?使用这种看似古怪的模式有危险吗?方法和变量存在于不同的名称空间中。因此,您可以使用相同名称的方法和变量(或者在本例中是常量)。然而,在使用它们时,Ruby需要能够区分它们。一般来说,这不是问题:消息有接收者,变量没有。消息有参数,变量没有。变量已分配给,消息未分配

唯一的问题是当你没有接受者,没有论点,也没有赋值。然后,Ruby无法区分没有参数的无接收者消息发送和变量发送之间的区别。因此,它必须制定一些武断的规则,这些规则基本上是:

  • 对于以小写字母开头的不明确标记,最好将其解释为消息发送,除非您确实知道它是一个变量(即解析器(而不是(!)解释器)以前见过赋值)
  • 对于以大写字母开头的不明确标记,首选将其解释为常量
请注意,对于带有参数的消息发送(即使参数列表为空),也没有歧义

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