2011-07-23 163 views
0

我從PHP切換到Ruby,並且還沒有理解一個好奇的Ruby類行爲,其中方法在類方法定義之外執行(請參見下面的示例)。在PHP中,當我們想要在類init上執行任何東西時,我們會把它放在構造函數方法中。Ruby:調用初始化方法

例如紅寶石(Rails)的:

class Comment < ActiveRecord::Base 
    belongs_to :post, :counter_cache => true 
end 

我是在理解是正確的belongs_to將在實例執行?而且是belongs_to一個從ActiveRecord繼承的類方法?

謝謝!

回答

3

在紅寶石,一切是可執行代碼。或者換句話說:一切是一個腳本。沒有「類別聲明」之類的東西。

,它位於在一個文件中,而不被內別的的方法等體,類體,模塊體或塊體的任何代碼,當該文件是load ED(或require d或require_relative d)被執行。這被稱爲腳本主體

創建該類或模塊時,將執行位於類或模塊主體內部的任何代碼。 (這是你所指的情況。)

枯燥的部分:調用方法體內的任何代碼時,或者更確切地說,當該方法被調用以響應接收消息時與方法名稱相同。 (Duh。)

當該塊爲yield編輯時,位於塊體內的任何代碼都會執行。

因爲一個類定義只是一個腳本,這意味着它可以包含任何類型的代碼,你想要的,包括方法調用:

class Foo 
    attr_accessor :bar # Yes, attr_accessor is just a method like any other 
    private # I *bet* you didn't know *that* was a method, too, did you? 
end 

或條件語句:

class Bar 
    if blah # e.g. check if the OS is Windows 
    def foo 
     # one way 
    end 
    else 
    def foo 
     # a different way 
    end 
    end 
end 
1

是的,它是ActiveRecord的一個類方法。該方法將在創建類本身時執行,而不是在創建類的實例時執行。