2016-12-09 14 views
2

我讀了續集的文檔,我得到了好奇在下面的代碼片段中使用的技術:如何在紅寶石中實現此結果?

class Post < Sequel::Model(:my_posts) 
    (...) 
end 

Sequel::Model(:my_posts)設置數據庫表的模型。我很好奇Model(:my_posts)中的括號。我喜歡這個界面,但是我怎樣才能做到這一點?這有點奇怪...看起來像Model可以被稱爲一種方法......這是什麼技術?有人能給我一個例子嗎?

+0

這只是在由常量'Sequel'引用的對象上調用名爲'Model'的方法,並將'Symbol':my_posts'作爲參數。該方法大概會返回'Class'類的一個實例,否則會得到一個'TypeError'。 –

回答

4

通常當你使用::模塊或類時,ruby會嘗試在常量中找到::之後的表達式。

Example::First => as constant 
Example::First() => as method 

運行這段代碼:

module Example 
    class << self 
    def First(a) 
     puts a 
    end 
    end 

    module First 
    end 
end 

用法:

Example::First(1) # => prints 1 

當您使用class << self你打開自己的類,這樣的方法可以被重新定義爲當前自對象(內類或模塊主體是類或模塊本身)。在SO上閱讀好question/answers

這是很好的做法,而不是強制性的,與 小寫字母開頭的方法的名稱,因爲以大寫字母 開頭的名稱是用Ruby常量。它仍然可以使用常量名 的方法,但你不能調用它沒有括號, 因爲interpeter將查找該名稱作爲常數

What are the restrictions for method names in Ruby?

+0

續集定義了一個方法'def_model'(參見[這裏](http://sequel.jeremyevans.net/rdoc/classes/Sequel/Model/ClassMethods.html#method-i-def_Model))來定義一個Model方法給定的模塊 – user3033467