我是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()方法在不同的库中,为什么它们仍然是重复的?怎么解决?
如果您导入这样的库#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都不可见,只有那些明确命名的(a和b这里).不过,我不确定这是否已经实施.
也许将来,我们会得到与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中的名称冲突.
| 归档时间: |
|
| 查看次数: |
364 次 |
| 最近记录: |