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

Fre*_*ind 2 dart

我是dart的新手,并尝试使用dart编写一个hello world和一个单元测试,但是我得到了错误:

duplicate top-level declaration 'METHOD main' at ../app.dart::5:6
Run Code Online (Sandbox Code Playgroud)

我的项目目录是test-dart,它有3个文件.

测试镖/ models.dart

class User {
  hello(String name) {
    print("Hello, ${name}");
  }
}
Run Code Online (Sandbox Code Playgroud)

测试镖/ app.dart

#library("app");

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

void main() {
  new User().hello("app");
}
Run Code Online (Sandbox Code Playgroud)

测试镖/测试/ test.dart

#library("test");

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

void main() {
  print("hello, test");
}
Run Code Online (Sandbox Code Playgroud)

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

duplicate top-level declaration 'METHOD main' at ../app.dart::5:6
Run Code Online (Sandbox Code Playgroud)

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

Lad*_*cek 6

如果您导入这样的库#import('../app.dart),则app.dart导入代码中将显示所有名称(实际上是所有公共名称 - 以a开头的名称_).因此,在您的test.dart库中,您现在可以main看到两个功能.这显然是一次碰撞.有两种方法可以解决它(我知道).

首先:使用前缀导入库,如下所示:#import('../app.dart', prefix: 'app').然后,所有公共名称app.dart仍然可见,但只有app前缀,因此main函数from app.dart只能通过app.main.这里没有碰撞,但每次都必须使用前缀.

第二:使用show组合器,如下:#import('../app.dart', show: ['a', 'b']).然后,所有名称app.dart都不可见,只有那些明确命名的(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");
}
Run Code Online (Sandbox Code Playgroud)

请注意现在如何使用"app"前缀访问app.dart库中的类和顶级函数,因此不会与test.dart中的名称冲突.