2017-02-14 178 views
1

如果我得到了一個名爲A其中進口BC模塊:實際上是否包含模塊?

module A exposing (..) 

import B 
import C 

B還導入C

module B exposing (..) 

import C 

會發生什麼? import實際上包含BC代碼,那麼C會在編譯時出現兩次A?或者,編譯器是否會用源代碼替換AB中導入模塊的每個成員?

回答

4

無論有多少個模塊被引用,它只會被編譯一次。

下面是一個有三個文件的示例:

A.elm

module A exposing (..) 

import B 
import C 

a : String 
a = 
    "Hi from A!\n" ++ B.b ++ "\n" ++ C.c 

B.elm

module B exposing (..) 

import C 

b : String 
b = 
    "Hi from B!\n" ++ C.c 

C.elm

module C exposing (..) 

c : String 
c = 
    "Hi from C!" 

產生的transpiled的JavaScript看起來像這樣(你產生JS可能會有所不同):

var _user$project$C$c = 'Hi from C!'; 

var _user$project$B$b = A2(_elm_lang$core$Basics_ops['++'], 'Hi from B!\n', _user$project$C$c); 

var _user$project$A$a = A2(
    _elm_lang$core$Basics_ops['++'], 
    'Hi from A!\n', 
    A2(
     _elm_lang$core$Basics_ops['++'], 
     _user$project$B$b, 
     A2(_elm_lang$core$Basics_ops['++'], '\n', _user$project$C$c))); 

正如你所看到的,C.elm代碼只包含一次。

+0

因此,遞歸導入沒有問題嗎? – Algorythmis

+1

如果您嘗試從A的B _and_ B引用A,則不允許導入循環。這會給您一個編譯錯誤。 –

相關問題