2015-12-19 25 views
0

我剛開始學習Elixir,我無法弄清Elixir中的導入工作原理。 當我使用import將模塊導入另一個模塊時,我無法使用導入的功能模塊調用導入的功能。在elixir中直接調用導入的模塊功能

但是我可以在導入的模塊中調用導入模塊的功能。

defmodule A do 
    def func do 
    IO.puts("func called") 
    end 
end 

defmodule B do 
    import A 
end 

A.funC# o/p: "func called" 
B.funC# (UndefinedFunctionError) undefined function: B.func/0 

defmodule B do 
    import A 

    def func2 do 
    func 
    end 
end 

B.func2 # o/p "func called" 

我無法弄清楚,爲什麼不B.func作品,而我是能夠調用funcfunc2。是否有某種我缺少的理論。來自Ruby背景的這種行爲對我來說看起來很奇怪。請任何人都可以幫助我,或者指點我一些很好的資源來閱讀。

回答

3

import並沒有像許多其他語言那樣真正導入任何東西。它所做的只是使導入模塊的導出函數可以從當前名稱空間訪問。引述the docs

我們使用import每當我們要輕鬆訪問功能或宏從其他模塊,而不使用完全合格的名稱。

如果你想要A.funcB.func指向相同的功能,你有幾個選項。第一個很簡單 - 做一個包裝函數:

defmodule B do 
    def func do 
    A.func 
    end 
end 

如果你想要一些更復雜的繼承類的東西,你可以考慮建立一個__using__宏觀與defoverridablesuper

+0

感謝您的聯繫和詳細的解答 –

+0

另一個方式來說是導入是詞法,這篇文章可以希望澄清它:http://thepugautomatic.com/2015/11/elixir-scoping/此外,避免「繼承像」的東西,它只鼓勵回調。 :) –

相關問題