【发布时间】:2014-07-29 05:47:06
【问题描述】:
我可以在 Dart VM 上运行这段代码:
@MirrorsUsed(metaTargets: Tag)
import 'dart:mirrors';
class Tag {
final Symbol name;
const Tag(this.name);
}
@proxy
@Tag(#[])
class Tagged {
noSuchMethod(Invocation invocation) {
InstanceMirror instanceMirror = reflect(this);
ClassMirror classMirror = instanceMirror.type;
classMirror.metadata.forEach((em) {
if (em.reflectee is Tag && em.reflectee.name == invocation.memberName)
print(invocation.positionalArguments);
});
}
}
void main() {
var tagged = new Tagged();
tagged[42];
tagged.foo();
tagged["Dart"];
}
输出:
[42]
[飞镖]
但是当我尝试用 dart2js 编译它时,它会因为这个错误而失败:
[来自 Dart2JS 的错误]:
bin\dart2jswithbracketanotation.dart:9:7:
预期的标识符,但得到了 '['。
@标签(#[])
那么哪个有bug?:
- (Dart VM)因为我可以运行它。
- (dart2js) 因为它不能编译成 js。
【问题讨论】:
-
#[]应该做什么/生产? -
根据规范,它应该为
[]运算符创建一个符号。如果您改用const Symbol('[]');会出现什么错误(应该具有相同的语义) -
@GünterZöchbauer 我添加了更多样板 - 为了现实主义:)
-
您是否已经尝试过
const Symbol('[]');或其他一些运算符,例如#+。 -
@GünterZöchbauer 是的。
#+可以,#[]不行