在dart文件中,我可以通过给它一个值(或表达式)来定义顶级变量:
String name = getNameFromSomewhere();
但在某些情况下,我需要断言它是一个有效的名称,所以我想:
String name = {
String _name = getNameFromSomewhere();
if(_name == null) {
throw new Exception("Name is invalid");
}
return _name;
}
但语法无效,相反,我必须使它成为一个函数和调用:
String name = (() {
String _name = getNameFromSomewhere();
if(_name == null) {
throw new Exception("Name is invalid");
}
return _name;
})();
但是代码不那么可读,有什么方法可以改进吗?
答案 0 :(得分:1)
在Dart中,没有必要在()
中包装IIFE,因此您可以通过这种方式清理语法。您还可以隐藏name
绑定并跳过私有本地。最后,可以使用var
,假设getNameFromSomewhere()
具有带注释的返回类型,该类型将被正确推断为String。
String name = () {
var name = getNameFromSomewhere();
if (_name == null)
throw new Exception("Name is invalid");
return name;
}();
现在,根据您要对此做什么,可能无法按预期工作。在Dart中,所有顶级成员和静态字段都被懒惰地初始化。在这种情况下,在第一次访问name
之前不会抛出异常。例如,以下代码不会抛出。
void main() {}
String getNameFromSomeWhere() => null;
String name = ...;
但是这段代码
void main() {
print(name);
}
String getNameFromSomeWhere() => null;
String name = ...;
答案 1 :(得分:1)
我将初始化程序设为私有函数,仅用于子类的可读性或覆盖:
String name = _getValidName();
String _getValidName () {
var name = _getNameFromSomewhere();
if (name == null)
throw new Exception("Name is invalid");
return name;
};
String _getNameFromSomewhere () { ... }