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:可能是一個消息發送或常量;分辨率規則說這是一個常數
相關問題