如何在 Dart 中区分类成员和同名的全局变量?

How to distinguish the class member from global variable with the same name in Dart?

提问人:Andrey 提问时间:10/28/2023 更新时间:10/28/2023 访问量:12

问:

我正在尝试以下代码:

String user() {
  return "";
}

class Foo {
  String user;
  Foo() : user = user(); // <= error here
}

void main() {}

但是由于名称的 ambuguity,它不起作用。

我可以将全局变量移动到另一个模块并导入以避免它。as globals

还有别的办法吗?

飞镖 全局变量 全球 模棱两可的语法

评论


答:

1赞 lrn 10/28/2023 #1

用于赋予普通标识符含义的 Dart 词法查找在包含具有该名称的成员的第一个作用域级别停止。 限定标识符 in 不会按词法查找,因此它们不会出现相同的问题。barfoo.bar

您需要提供一种使用另一个纯名称或使用限定名称访问外部名称的方法。

另一个纯名称是更简单的方法:

String user() {
  return "";
}

String _user() => user(); // Add redirect with other name
// or `const _user = user;` to create a tear-off.

class Foo {
  String user;
  Foo() : user = _user(); // <= No error now
}
void main() {}

为顶级名称添加前缀稍微困难一些。如果是导入的名称,请同时导入带有前缀的同一库:

import "other.dart"; // provides `user`
import "other.dart" as other; // access also as `other.user`
...
  : user = other.user() ...

如果成员在同一库中声明,则解决方案是相同的:导入带有前缀的库。将当前库导入到自身中感觉有点奇怪,但它完全没问题且有效 Dart。

library my_library;
import "my_library.dart" as self;
String user() => ...
// ...
   ...: user = self.user() ...

只有顶级名称才有此问题。可以使用 ClassName.staticMemberthis.instanceMember 使用限定标识符访问静态或实例成员,而无需引入新的前缀名称。