2

私はdartを初めて使用し、dartを使用してHello Worldと単体テストを作成しようとしていますが、エラーが発生します。

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

私のプロジェクトディレクトリはtest-dartで、3つのファイルがあります。

test-dart / models.dart

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

test-dart / app.dart

#library("app");

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

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

test-dart / test / test.dart

#library("test");

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

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

の「test.dart」にvoid main()エラーがあります。エラーメッセージは次のとおりです。

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

2つのmain()メソッドは異なるライブラリにありますが、なぜまだ複製されているのですか?それを修正する方法は?

4

2 に答える 2

6

このようなライブラリをインポートすると#import('../app.dart)、からのすべての名前app.dartがインポートコードに表示されます(すべてのパブリック名、実際には-で始まらない_名前)。したがって、test.dartライブラリには2つのmain関数が表示されます。それは明らかに衝突です。それを解決する方法は2つあります(私が知っていることです)。

まず、次のようにプレフィックスを付けてライブラリをインポートします#import('../app.dart', prefix: 'app')。その後、からのすべてのパブリック名app.dartは引き続き表示されますが、appプレフィックスが付いているだけなので、mainからの関数にapp.dartは。でのみアクセスできますapp.main。ここでは衝突はありませんが、毎回プレフィックスを使用する必要があります。

show2番目:次のようにコンビネータを使用します: #import('../app.dart', show: ['a', 'b'])。そうすると、からのすべての名前app.dartが表示されるのではなく、明示的に名前が付けられた名前(aおよびbここ)のみが表示されます。ただし、これがすでに実装されているかどうかはわかりません。

たぶん将来的には、showあなたができるように、コンビネータとは反対の何かを手に入れるでしょう#import('../app.dart', hide: ['main'])。これが問題の最善の解決策になりますが、現在の言語(0.09で指定)ではありません。

于 2012-05-31T06:19:45.850 に答える
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ライブラリのクラスとトップレベル関数が「app」プレフィックスを使用してアクセスされるようになり、test.dartの名前と衝突しないことに注意してください。

于 2012-05-31T06:12:15.550 に答える