2012-05-31 45 views
2

我是新來的鏢,並且試圖用鏢寫一個Hello World和單元測試,但我得到的錯誤:重複頂級聲明「的方法主要」中鏢

duplicate top-level declaration 'METHOD main' at ../app.dart::5:6 

我項目目錄是test-dart,它有3個文件。

測試鏢/ models.dart

class User { 
    hello(String name) { 
    print("Hello, ${name}"); 
    } 
} 

測試鏢/ app.dart

#library("app"); 

#source("./models.dart"); 

void main() { 
    new User().hello("app"); 
} 

測試鏢/測試/ test.dart

#library("test"); 

#import("../app.dart"); 

void main() { 
    print("hello, test"); 
} 

現在有上void main()在「test.dart」錯誤,該錯誤信息是:

duplicate top-level declaration 'METHOD main' at ../app.dart::5:6 

兩個main()方法在不同的庫,爲什麼他們仍然複製?如何解決它?

回答

6

如果導入這樣#import('../app.dart)庫,然後從app.dart所有名稱在導入代碼變得可見(所有公共的名字,其實 - 那些開始用_)。因此,在您的test.dart庫中,現在可以看到兩個main函數。這顯然是一場碰撞。有兩種方法可以解決它(我知道的)。

首先:使用前綴導入庫,如下所示:#import('../app.dart', prefix: 'app')。然後,app.dart中的所有公用名仍可見,但前綴只有app,因此app.dart中的main功能僅可由app.main訪問。這裏沒有碰撞,但你必須每次都使用前綴。

第二:使用show組合器,如下所示:#import('../app.dart', show: ['a', 'b'])。那麼,所有名稱都不可見,只有那些明確命名的(這裏爲ab)。不過,我不確定這是否已經實施。

也許在將來,我們會得到與show組合子相反的東西,這樣你就可以做#import('../app.dart', hide: ['main'])。這將是解決您的問題的最佳解決方案,但它不在當前語言中(如0.09所述)。

5

您正在導入app.dart而沒有前綴,這意味着如果您的示例中存在重複項,則導入庫和導入庫的符號可能會發生衝突。

要解決這些衝突,庫導入允許您使用標識符爲導入添加前綴。如果你改變你的test.dart的例子應該如下工作:

#library("test"); 

#import("../app.dart", prefix: "app"); 

void main() { 
    print("hello, test"); 
    app.main(); 
    new app.User().hello("main"); 
} 

注意如何在app.dart庫中的類和頂級函數現在使用的「應用程序」前綴訪問,因此不與test.dart中的名稱相沖突。