我花了20个小时来学习Dart语言的基础知识,但是当我在开源Dart程序中找到@
前缀时,我发现here大多数程序都使用,我想知道@
指令在这些程序中的作用......
有关您的信息,the official documentation says the following:
元数据 使用元数据提供有关代码的其他信息。元数据注释以字符@开头,后跟对编译时常量的引用(例如不推荐使用)或对常量构造函数的调用。 所有Dart代码都有三个注释:@ deprecated,@ override和@proxy。有关使用@override和@proxy的示例,请参阅“扩展类”一节。以下是使用@deprecated注释的示例:
然而,"附加信息" @
指令是否会添加到代码中?如果通过编写以下构造函数
@todo('seth', 'make this do something')
,而不是以下构造函数,它是默认值:
todo('seth", 'make this do something')
,我可以从第一个构造函数中获得什么好处?
我已经知道使用内置元数据(例如@deprecated
和@override
)可以让我在运行应用时受到警告,但我可以从案例中获得什么在自定义@todo
上,或上述链接的示例代码通过Github?
答案 0 :(得分:3)
可以通过dart:mirrors库访问注释。您可以在需要提供有关类,方法等的其他信息时使用自定义注释。例如,@MirrorsUsed用于为dart2js编译器提供额外信息以优化生成的JavaScript的大小。
对于框架或库作者而言,注释通常比应用程序作者更有用。例如,如果您在Dart中创建REST服务器框架,则可以使用注释将方法转换为Web资源。例如,它可能类似于以下内容(假设您已创建@GET注释):
@GET('/users/')
List<User> getUsers() {
// ...
}
然后,您可以让您的框架在服务器启动时使用镜像扫描您的代码,以使用@GET注释查找所有方法,并将该方法绑定到注释中指定的URL。
答案 1 :(得分:2)
你可以做一些推理&#39;关于代码。 您可以查询具有特定注释的fields / methods / classes / libraries / .... 您使用反射获取这些代码部分。在Dart反射是由'dart:mirrors&#39;完成的。封装
您可以在此处找到代码示例:How to retrieve metadata in Dartlang?
定期使用注释的示例是序列化或数据库持久性,您可以将metatdata添加到类中,该类可以通过序列化/持久性框架用作配置设置,以了解如何处理字段或方法。
例如,您添加@Entity()
注释以指示应该保留此类。
在应该保留的每个字段上,添加另一个注释,如@Column()
。
许多持久性框架从此元数据自动生成数据库表。
为此,他们需要更多信息,因此您在应该用作主键的字段上添加@Id()
,并在@Column(name: 'first_name', type: 'varchar', length: 32)
中添加数据库表和列的参数。
这只是一个例子。限制是你的想象力。