【问题标题】:What does the dollar sign mean when put before a class call in Flutter?在 Flutter 中的课程调用之前放置美元符号是什么意思?
【发布时间】:2021-01-19 06:08:59
【问题描述】:

我是 Flutter/Dart 的初学者,我经常看到在调用类或方法之前出现美元符号,示例如下(可在 Floor 包文档中找到):

 final database = await $FloorAppDatabase.databaseBuilder('app_database.db').build();

我已经搜索了很多,我能找到的 Dart 中美元符号的唯一含义是用于字符串插值,但情况似乎并非如此。

【问题讨论】:

标签: flutter dart dollar-sign


【解决方案1】:

这不是 Flutter 或 Dart 约定 - 至少不是官方约定:the official Dart naming conventions document(截至 2020 年 10 月)未提及在标识符名称中使用 $。

但是,我知道其他编程语言的生态系统确实使用美元符号 (Sigil),我认为这种习惯是由 floor 数据库的作者继承的链接到。更具体地说,in Java it's commonplace to use a $ prefix for type-names generated by tooling 不是手写的(例如 ORM 实体类型),在 JavaScript 中使用 RxJS 可观察对象的人将使用a $ as a variable-name suffix。

由于$FloorDatabase 是类型名称,而不是变量或成员名称,我将假设它是从 Java 中汲取的习惯:

Java:$ 字符应仅用于机械生成的源代码中,或者很少用于访问旧系统上预先存在的名称。

所以在这种情况下,a clue is in the documentation you linked to:

使用生成的代码。要获取数据库实例,请使用生成的$FloorAppDatabase 类,它允许访问数据库构建器

这就是我的结论:这不是 Dart/Flutter 中的官方命名约定,但它是在 Java 中的,而且floor 的作者似乎是从 Java 中继承过来的。

(我个人希望他们不这样做,因为它不是一个特别有用的指标 - 如果一个类型是由工具创建而不是手写的,这对消费应用程序有什么影响?)

【讨论】:

  • 使用 $ 确实是典型的 Dart 代码生成器使用的约定(例如 package:built_value)。我个人认为它很有用,因为那时我知道我不能直接在名称上使用grep 来查找其定义。
  • 如果真的是这样,我完全同意这个符号约定不应该移植到 dart。它具有误导性,并且可能使一些不经意的初学者(例如我)感到困惑。我会等待更多答案,但您的答案似乎是正确的。
  • @jamesdlin,你的例子让我很兴奋,但我不太明白。你能举一个更具体的例子吗? (所以也许我改变了使用这个符号的想法)。
  • 对不起,符号*,不是运算符
  • 例如,如果您查看一些代码并在符号名称中看到$,那么您就知道发生了一些代码生成魔术。在您的特定情况下,如果您正在寻找 $FloorAppDatabase 的实现以查看它是如何工作的,您可以很容易地告诉您需要运行代码生成器 first 然后搜索生成的输出。
猜你喜欢
  • 2012-02-24
  • 2020-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多