dart,是否可以在加载库时执行代码?
我的lib/sndbx.dart文件中有一个库:dart,是否可以在加载库时执行代码?,dart,Dart,我的lib/sndbx.dart文件中有一个库: 库sndbx; 布尔福(){ 打印(“嘿嘿!”); 返回true; } boolbar=foo(); 我的bin/sndbx_cmd.dart中有一个main: import'package:sndbx_cmd/sndbx.dart'; void main(){ 打印(“你好,世界!”); } 但是我没有看到命令行中打印“嘿嘿!”字样,为什么在加载库时它没有定义顶级bool变量bar 我看到如果我得到条值: import'package:sn
库sndbx;
布尔福(){
打印(“嘿嘿!”);
返回true;
}
boolbar=foo();
我的bin/sndbx_cmd.dart中有一个main:
import'package:sndbx_cmd/sndbx.dart';
void main(){
打印(“你好,世界!”);
}
但是我没有看到命令行中打印“嘿嘿!”字样,为什么在加载库时它没有定义顶级bool变量bar
我看到如果我得到条
值:
import'package:sndbx_cmd/sndbx.dart';
void main(){
打印(“你好,世界!”);
印刷品(条形);
印刷品(条形);
}
我得到:
你好,世界!
嘿嘿!
真的
真的
那么为什么它只调用一次foo
?如果我将其更改为:
库sndbx;
bool=false;
布尔福(){
打印(“嘿嘿!”);
returncalled=!called;
}
boolbar=foo();
因为
bar
在项目加载时没有定义,它感觉像是一个getter,但它只在第一次调用时获取值,并且该值被缓存在那里,我可能希望它在每次访问它时都继续调用foo
,因为它在第一次访问时就是这样做的,与最初加载库时定义相反。如果您希望每次读取时都调用它,那么实际上您需要创建一个getter
bar
是惰性的(第一次访问时)
据我所知,没有办法在库加载时执行代码。您必须从
main()
(或者一个名为formmain()
的方法)调用它。是的,这正是我所想的,我只是想知道是否有一个原因,它是在第一次访问时而不是在“第一次访问之前”进行评估的因为我看不出为什么不能事先对其进行评估。如果不访问,代码执行将是多余的。这是一个性能优化。介绍何时引入此功能。不仅是性能优化,也是可预测性改进。执行代码可能有副作用。在Dart中,当顶级/静态变量的初始值设定项被执行时——当您第一次访问它时——是非常可预测的。程序中执行的所有代码都来自初始的“main”调用。如果在加载库时(调用main之前)执行了初始值设定项,则运行时必须选择一个初始化顺序,并且如果初始值设定项抛出(例如,循环引用列表'final x=x;'),则必须有一种方法来处理它。那么polymer dart呢,有人能解释一下在加载库时它是如何注册注释的吗?正如我在src:///元数据中读到的那样,元数据用于标记静态或顶级方法,这些方法在加载自定义元素库时自动调用//。const initMethod=const InitMethodAnnotation();