在飞镖中复制顶级声明'METHOD main'

时间:2012-05-31 05:30:53

标签: dart

我是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");
}

现在void main()上的“test.dart”出现错误,错误消息为:

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

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

2 个答案:

答案 0 :(得分:6)

如果您导入类似#import('../app.dart)的库,那么app.dart中的所有名称都会在导入代码中显示(所有公共名称,实际上 - 那些不要_开头。因此,在您的test.dart库中,您现在可以看到两个main个函数。这显然是一次碰撞。有两种方法可以解决它(我知道)。

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

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

也许在将来,我们会得到与b组合器相反的东西,以便您可以show。这将是您的问题的最佳解决方案,但它不是当前语言(由0.09指定)。

答案 1 :(得分: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”前缀访问app.dart库中的类和顶级函数,因此不会与test.dart中的名称冲突。