【问题标题】:What does @ do in Dart programs?@ 在 Dart 程序中做了什么?
【发布时间】:2014-06-22 00:14:48
【问题描述】:

我刚刚花了 20 个小时来学习 Dart 语言的基础知识,但是当我在诸如 here 之类的开源 Dart 程序中找到 @ 前缀时,我发现大多数程序都使用它,我想知道@ 指令在这些程序中做了什么......

供您参考,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 上的链接示例代码?

【问题讨论】:

    标签: dart metadata


    【解决方案1】:

    可以通过dart:mirrors 库访问注释。每当您想提供有关类、方法等的额外信息时,您都可以使用自定义注解。例如,@MirrorsUsed 用于为 dart2js 编译器提供额外信息,以优化生成的 JavaScript 的大小。

    对于框架或库的作者来说,注解通常比应用程序作者更有用。例如,如果您在 Dart 中创建一个 REST 服务器框架,您可以使用注释将方法转换为 Web 资源。例如,它可能如下所示(假设您已经创建了 @GET 注释):

    @GET('/users/')
    List<User> getUsers() {
     // ...
    }
    

    然后,您可以让您的框架在服务器启动时使用镜像扫描您的代码,以查找所有带有 @GET 注释的方法,并将该方法绑定到该注释中指定的 URL。

    【讨论】:

      【解决方案2】:

      您可以对代码进行一些“推理”。 您可以查询具有特定注释的字段/方法/类/库/...。 您使用反射获取这些代码部分。在 Dart 中,反射是由 'dart:mirrors' 包完成的。

      您可以在此处找到代码示例:How to retrieve metadata in Dartlang?

      注释经常使用的示例是用于序列化或数据库持久性,您可以将元数据添加到类中,序列化/持久性框架可以将其用作配置设置,以了解如何处理字段或方法。

      例如,您添加一个@Entity() 注释以指示该类应该被持久化。 在每个应该持久化的字段上添加另一个注释,例如@Column()。 许多持久性框架自动从该元数据生成数据库表。 为此,他们需要更多信息,因此您在应用作主键的字段上添加 @Id() 并添加 @Column(name: 'first_name', type: 'varchar', length: 32) 以定义数据库表和列的参数。 这只是一个例子。极限是你的想象力。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-02
        • 1970-01-01
        • 2021-11-11
        • 1970-01-01
        • 2013-10-05
        • 2012-10-16
        • 2023-03-14
        • 1970-01-01
        相关资源
        最近更新 更多