如何为 Dart 编写注释

wil*_*ill 8 javascript annotations dart

问题:

  • 实现注释的过程是什么。
  • 如何,或者何时可以激活您开发的注释?

我似乎找不到关于如何编写类来实现注释的示例或教程 .

例如,对于 Java,您可能有一个表示在编译时调用的类的注解,并允许您修改或注入代码。Dart 注释是否也像这样工作?

背景

我已经对 Dart 生态系统的这一领域进行了一些(进一步的)挖掘。我正在添加一些注释,因为注释可以是强大的,并且可以对如何使用它进行透明的评论。

在查看了 Dart 的一些实际注释后,Dart 注释记录了“一个符号”(标签或元数据标签)。问题是如何在 Dart 中使用注解。

黄昏

基于查看代码位,我目前的理解是它们是类对象上的标记。看起来注释是高度非结构化的,因为虽然可以简单地声明注释,但没有结构可以使用或识别标签(又名annotation)。

注释步骤

  1. 确定要标记的属性或操作。
  2. 需要编写代码来使用或“工作”您的注释。以Observe为例。
  3. 您可以实施和测试加载时间代码来查找和处理您的标签。例如,我没有看到用于注册注释和提供处理程序的基础结构。
    • 这是通过库中的 main() 方法完成的。
  4. 实施和测试注释行为。

至少我认为它是这样工作的。Dart 语言规范中关于这方面的信息并不多。

观察和检查也提出了一些一般性问题。我留下了一个阅读清单,里面有各种各样的例子,以帮助其他人加入探索。

阅读

例子

lrn*_*lrn 13

任何具有 const 构造函数的类都可以用作注解。

const FOO = const Foo(37);

@Foo(42)
class Foo {
  @Deprecated("until further notice");
  final int x;
  @FOO
  const Foo(this.x);
}
Run Code Online (Sandbox Code Playgroud)

仅此而已。

另见https://www.dartlang.org/docs/dart-up-and-running/contents/ch02.html#ch02-metadata

元数据本身不做任何事情。如果您的程序想要从类中读取元数据,则需要使用镜像。

import 'dart:mirrors';
const tag = "TAG"; 

@tag class C {}
void main() {
  print(reflectClass(C).metadata.first.reflectee);  // prints "TAG"
  var c = new C();
  print(reflect(c).type.metadata.first.reflectee);  // prints "TAG" 
}
Run Code Online (Sandbox Code Playgroud)

请参阅:https : //api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/dart-mirrors.ClassMirror#id_metadata

或者,您可以直接处理源。例如,dart2js 编译器有一个反映源结构的“源镜像”库。这就是 dart2js 和分析器为理解“代理”注释所做的工作。

  • 所展示的只是如何将元数据分配给项目。这似乎只是注释实现的 10%。例如,像@observable 这样的钩子代码是如何进行观察的? (4认同)
  • 例如,如果有人尝试使用注释来创建诸如“json_serialized”之类的内容,您应该查找 dart 代码生成,特别是“source_gen”包 (2认同)
  • 注释没有任何作用。您需要一个工具来识别注释并为您做一些事情。对于“@deprecated”,该工具是 Dart 分析器,它可以识别注释并在您使用注释为已弃用的内容时向您发出警告。其他注释可能属于其他工具。 (2认同)