代码之家  ›  专栏  ›  技术社区  ›  Daniel Beardsley

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

  •  2
  • Daniel Beardsley  · 技术社区  · 15 年前

    factory_girl . 他们解决了所以你可以两者兼用 Factory.create(...) Factory(...) 我想了想,很想看看他们是怎么来上课的 Factory 也像一个方法。

    他们只是用 工厂

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

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

    1 回复  |  直到 15 年前
        1
  •  7
  •   Jörg W Mittag    15 年前

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

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

    • 除非 你肯定知道它是一个变量(即
    • 对于以大写字母开头的不明确标记,最好将其解释为常量

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

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