如何在顶级定义变量并在dart中断言它?

时间:2018-04-07 06:33:17

标签: dart

在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;
})();

但是代码不那么可读,有什么方法可以改进吗?

2 个答案:

答案 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 () { ... }