2015-04-05 171 views
0

我是Ruby新手。我的一些代碼,我在這裏讀困惑:我可以在Ruby中使用模塊內的模塊嗎?

http://hawkins.io/2012/03/defining_plugins_gems_railties_and_engines/

這是代碼:

module Cashier 
    class Railtie < ::Rails::Railtie 
    config.cashier = Cashier 

    initializer "cashier.active_support.cache.instrumentation" 
     ActiveSupport::Cache::Store.instrument = true 
    end 
    end 
end 

我被這一行感到驚訝,這不是在大多數語言被允許:

config.cashier = Cashier 

所以我在模塊收銀員的定義裏面,但我也得到實例化模塊收銀員的一個實例,並在這裏使用它?這一行發生了什麼?當我在代碼中定義收銀員的位置時,我怎樣才能指定收銀員?在Java中,我認爲我沒有在類的定義中實例化一個類。

回答

1

您還沒有實例收銀員在這裏(你不能在Ruby中創建模塊的情況下,無論如何);你只是引用了Cashier常量,它指的是Module的一個實例,當你到達這條線時已經定義了這個實例。

紅寶石創建一個空的模塊實例,並將其分配給憑藉module Foo的富恆定。模塊主體定義可以被視爲重新打開空模塊並向其添加附加功能。 Ruby不需要完整的模塊定義來「完成」一個模塊並將其分配給一個常量;它是在甚至考慮到主體定義之前創建和分配的。

也就是說,代碼:

module Foo 
    puts Foo.object_id 
end 

在功能上等同於:

# Create a new Module instance and assign it to the Foo constant 
Foo = Module.new 

# Reopen the Module instance assigned to the constant Foo for modification 
module Foo 
    # Do stuff in here to add functionality to the Foo module 
    # Since Foo is already defined, we can get its object_id. 
    puts Foo.object_id 
end 

這當然是沒有意義的,從編譯語言的角度來看未來的(畢竟,你怎麼知道什麼Cashier是如果你還沒有完成它的定義呢?),但是Ruby的解釋性意味着它傾向於將模塊和類的定義稍微鬆散一些,這就是允許這種行爲的原因。

+1

這不是在編譯語言既空前,幾乎所有的現代語言讓函數名函數體內已經定義:在'C','無效無限(無效){無限(); }'不會拋出編譯錯誤。 :) – Amadan 2015-04-06 04:41:24

相關問題