Dart中字符串表达式的难以理解的行为

时间:2018-11-08 21:52:20

标签: dart

今天,我决定开始学习Dart语言,而我从Tour开始,那里有一个示例:

// These work in a const string.
const aConstNum = 0;
const aConstBool = true;
const aConstString = 'a constant string';

// These do NOT work in a const string.
var aNum = 0;
var aBool = true;
var aString = 'a string';
const aConstList = [1, 2, 3];

const validConstString = '$aConstNum $aConstBool $aConstString';
// const invalidConstString = '$aNum $aBool $aString $aConstList';

和文字:

  

文字字符串是编译时常量,只要   插值表达式是一个编译时常量,其计算结果为   null或数字,字符串或布尔值。

我的问题与代码的最后一行有关。我已经阅读了几次文本,但我不明白为什么不能将表达式('$aNum $aBool $aString $aConstList')的结果赋给const变量。但是,如果我这样更改代码:

const validConstString = '$aConstNum $aConstBool $aConstString';
var validString = '$aNum $aBool $aString $aConstList';

它将起作用。这些插值表达式之间有什么区别?我试图通过调试器查看结果:

enter image description here

我一直看到两个变量都具有相同类型的数据。只是字符串而已。

2 个答案:

答案 0 :(得分:4)

这里

const aConstNum = 0;
const aConstBool = true;
const aConstString = 'a constant string';

您要声明常量值。它们不会在运行时更改,因此您在编译时知道该值将始终相同。因此,您可以在编译时将结果字符串声明为const。

const validConstString = '$aConstNum $aConstBool $aConstString';

这里

var aNum = 0;
var aBool = true;
var aString = 'a string';

您将变量声明为var。它们可以在运行时更改其值,因此即使您分配了初始值,您也无法在编译时说出它们在应用程序生存期内的值。

这就是为什么将结果字符串声明为var的原因。

var validString = '$aNum $aBool $aString $aConstList';

两个结果变量都将是字符串,但是第一个变量在应用程序的整个生命周期中将保持不变,而第二个变量可以在单个变量更改时更改。

答案 1 :(得分:2)

由于var aNum = 0;不是const值,因此不能在字符串插值中将其用于另一个const值(const validConstString)。

const表示编译时常量,var是仅在运行时获取值的变量,因此不能用于“计算”其他const值。