2012-04-06 54 views
7

test_module.rb紅寶石module_function,調用模塊的私有方法,在模塊類的方法調用風格顯示錯誤

module MyModule 
    def module_func_a 
     puts "module_func_a invoked" 
     private_b 
    end 

    module_function :module_func_a 

    private 
    def private_b 
     puts "private_b invoked" 
    end 
    end 

    class MyClass 
    include MyModule 
    def test_module 
     module_func_a 
    end 
    end 

從類調用模塊功能

c = MyClass.new 
    c.test_module 

輸出1:

$ ruby test_module.rb 
module_func_a invoked 
private_b invoked 

上模塊調用模塊的功能在類方法風格

ma = MyModule.module_func_a 

輸出2:

module_func_a invoked 
test_module.rb:5:in `module_func_a': undefined local variable or method `private_b' for MyModule:Module (NameError) 
from test_module.rb:31 

如可從包括在模塊中時,輸出1和輸出2 可以看出一個類,當模塊的私有方法從模塊函數 被調用時,在直接調用c中模塊上的模塊函數時不會發生問題lass方法樣式模塊的私有方法,從模塊函數調用,未找到。

任何人都可以讓我理解上述行爲背後的原因,以及是否可以或不可以調用模塊函數(反過來調用模塊的私有方法)模塊上的類方法樣式?如果可能的話,那麼在我的代碼中需要做些什麼糾正才能做到這一點?

回答

6

它的工作原理,當您在一個類中的模塊,因爲那時所有的模塊的方法獲得包含在類(selfmodule_func_aMyClass,這也將private_b方法)。

在其他情況下自點MyModule,不具有private_b方法。如果你希望它是雙向的,你必須要麼聲明private_b作爲一個模塊方法爲好,或者乾脆將行添加到extend selfMyModule,使所有它的方法將成爲模塊的方法。

+0

Thanks.This works.I試圖延長自我Mymodule中,這是working.However似乎在這種情況下,私人似乎是多餘的,並沒有effect.So難道是像那些提到的情況下,我們不能創建私有方法?例如,我需要創建一個實用程序方法,該方法只能由模塊實例或模塊函數使用,不應該暴露給模塊的用戶。 – 2012-04-06 12:19:34

+0

您不能,這就是爲什麼我更喜歡使用委派。 – psyho 2012-04-06 12:27:37

+2

@pysho - 你能否給我一個例子或者提供一個鏈接,提供關於如何使用你提到的代表團的細節? – 2012-04-06 12:57:44

3

module_function不會複製您的module_func_a到元類而不是它的依賴。

所以從一個對象調用module_func_a時,你會得到另一種方法private_b。但在模塊上調用它本身會失敗,因爲private_b不是模塊函數。

您應該使用module_function爲private_b過,它應該工作。