作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
class Foo {
final DateTime date;
static final DateTime defDate = DateTime.now();
Foo([this.date = defDate]); // Error
}
这段代码有什么问题,我提供了一个 static
final
值作为可选参数的默认值,但是 Dart 不接受它,任何人都可以请解释这种行为?
编辑:
// Global field
final DateTime defDate = DateTime.now();
class A {
void a([DateTime i = defDate]) => a; // Shouldn't have an error
}
class B extends A {
@override
void a([DateTime i = defDate]) => a; // Shouldn't have an error
}
最佳答案
出于多种原因,Dart 默认值必须是编译时常量。
首先,默认值被认为是实例方法签名的一部分。子类必须重写参数采用相同默认值的方法。如果在编译时不知道该值,那将毫无意义。
更重要的是,没有一个明显的时间应该计算表达式。 Dart 故意避免在启动 main
之前评估任何内容以减少启动延迟。唯一的异常(exception)是编译时常量,因为它们可以完全在编译时求值。这意味着当你第一次使用默认值的函数时,默认值还没有被评估。它肯定需要在那个时候被评估,至少如果你省略了参数的参数,所以编译器可能必须在函数调用的中间评估任意表达式。除了额外的开销,这本身就是一个问题,真正的问题是它使代码不可预测。在您的示例中,默认值将是 DateTime.now()
,恰好是首次调用该函数的时间。
另一种方法是在每次调用函数时在没有参数的情况下评估默认值表达式。 Dart 语言团队正在考虑该选项(作为潜在的 future 举措,目前没有真正的计划),但这意味着放弃默认值是签名的一部分的想法。在语言做这样的事情之前,默认值必须是常量。
关于dart - 为什么可选参数的默认值必须是常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63269492/
我正在尝试用 Swift 编写这段 JavaScript 代码:k_combinations 到目前为止,我在 Swift 中有这个: import Foundation import Cocoa e
我是一名优秀的程序员,十分优秀!