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

我的lib/sndbx.dart文件中有一个库:

库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()
(或者一个名为form
main()
的方法)调用它。

是的,这正是我所想的,我只是想知道是否有一个原因,它是在第一次访问时而不是在“第一次访问之前”进行评估的因为我看不出为什么不能事先对其进行评估。如果不访问,代码执行将是多余的。这是一个性能优化。介绍何时引入此功能。不仅是性能优化,也是可预测性改进。执行代码可能有副作用。在Dart中,当顶级/静态变量的初始值设定项被执行时——当您第一次访问它时——是非常可预测的。程序中执行的所有代码都来自初始的“main”调用。如果在加载库时(调用main之前)执行了初始值设定项,则运行时必须选择一个初始化顺序,并且如果初始值设定项抛出(例如,循环引用列表'final x=x;'),则必须有一种方法来处理它。那么polymer dart呢,有人能解释一下在加载库时它是如何注册注释的吗?正如我在src:///元数据中读到的那样,元数据用于标记静态或顶级方法,这些方法在加载自定义元素库时自动调用//。const initMethod=const InitMethodAnnotation();