2

我是 dart 新手,并试图使用 dart 编写一个 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");
}

现在 "test.dart" on 有一个错误void main(),错误信息是:

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

这两种main()方法在不同的库中,为什么它们仍然重复?如何解决?

4

2 回答 2

6

如果您像这样导入一个库#import('../app.dart),那么所有来自的名称都app.dart将在导入代码中可见(实际上是所有公共名称——那些以 a 开头的名称_)。所以在你的test.dart库中,你现在有两个main可见的函数。那显然是碰撞。有两种方法可以解决它(我知道)。

首先:导入带有前缀的库,如下所示:#import('../app.dart', prefix: 'app'). 然后,来自的所有公共名称app.dart仍然可见,但只有app前缀,因此main函数 fromapp.dart只能由 访问app.main。这里没有冲突,但是您每次都必须使用前缀。

第二:使用show组合器,如下所示:#import('../app.dart', show: ['a', 'b']). 然后,不再是所有的名字app.dart都是可见的,只有那些明确命名的(ab这里)。不过,我不确定这是否已经实施。

也许将来,我们会得到与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 回答