【问题标题】:Why is it an error in Dart to try to set a static variable in the global namespace?为什么 Dart 中尝试在全局命名空间中设置静态变量会出错?
【发布时间】:2021-10-22 23:52:06
【问题描述】:

为什么 Dart 尝试在全局空间中设置类的静态变量会报错?

例子:

class Name {
  static String? firstName;
}

Name.firstName = 'Mike'; // Error

void main() {
  Name.firstName = 'Mike'; // Ok
}

这没什么大不了的。我只是遇到了这个,然后找不到解释为什么会这样。它在文档中的什么地方描述了这里的细微差别?

[更新]

引发的实际错误包括:“必须使用关键字 'const'、'final'、'var' 或类型名称声明变量。”

您实际上可以在函数之外执行语句,但它们必须是声明作用域变量的语句。也许这些不是技术上的陈述,而只是变量实例化。

class Name {
  static String? staticName;
  String? lastName;
}

final me = Name(); // Ok
me.lastName = 'Jones'; // Error

void main() {
  Name.staticName = 'Mike'; // Ok
  final you = Name(); // Ok
  you.lastName = 'Smith'; // Ok
}

没有变量作用域,编译器认为我必须定义一个函数,当没有参数列表或函数体时它会感到困惑。

根据@jamesdlin 的回答,语句仅限于函数定义的变量实例化是有道理的,因此不会对文件的其他导入器产生与执行顺序相关的副作用。

【问题讨论】:

  • 你没有在类或函数中使用它。

标签: dart


【解决方案1】:

Name.firstName = 'Mike'; 是一个声明。您不能在全局命名空间中执行任意语句。他们会按什么顺序执行?假设你有:

name.dart:

class Name {
  static String? firstName;
}

mike.dart:

import 'name.dart';
Name.firstName = 'Mike';

spike.dart:

import 'name.dart';
Name.firstName = 'Spike';

最后:

import 'name.dart';
import 'mike.dart';
import 'spike.dart';

void main() {
  print(Name.firstName);
}

应该发生什么?多个库分配给Name.firstName是否违法?最后一个imported 应该赢吗?如果是这样,那么突然导入一个库会有副作用,而且顺序很重要。如果导入的库导入其他有副作用的库会怎样?

这是一个完全没有必要的巨大头痛,因为您本来可以这样做:

class Name {
  static String? firstName = 'Mike';
}

首先。

【讨论】:

    猜你喜欢
    • 2012-01-06
    • 1970-01-01
    • 2017-02-12
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 2017-03-24
    • 2012-07-22
    • 2011-03-25
    相关资源
    最近更新 更多