在dart中,为什么选择const cities = ['Delhi', 'UP', 'Noida'];//错误在这一行cities[0] = 'Mumbai';是运行时错误,而不是编译时错误?
const cities = ['Delhi', 'UP', 'Noida'];
cities[0] = 'Mumbai';
k7fdbhmy1#
有关dart中const的含义,请参见this answerTLDR常量变量由dart预编译,您无法在运行时修改它们。
const cities = ['Delhi', 'UP', 'Noida']; cities[0] = 'Mumbai'; // Throws at runtime
字符串使用final或var代替。
final cities = ['Delhi', 'UP', 'Noida']; cities[0] = 'Mumbai'; // Works OK
型
x7rlezfr2#
https://www.peachpit.com/articles/article.aspx?p=2468332&seqNum=5#:~:text=EXAMPLE%204.12&text= Unlike%20final%20variables%2C%20properties%20of,its%20values%20cannot%20be%20changed.使用普通变量,与常量一样,在运行时不能更改列表的值。我假设这是用var或final完成的,因为我自己不是 dart 大师。
var
final
o8x7eapl3#
目前在Dart中没有办法指示一个方法是否改变了它的对象,或者保证不改变它。(这与C不同,在C中,一个方法可以标记为const,以表明它不会(明显地)改变对象。因此,Dart编译器没有好的方法来知道不应该允许在const对象上调用operator []=,所以不幸的是,直到运行时才知道它违反了对象的const特性。
const
operator []=
u5i3ibmn4#
当你使用const关键字声明一个列表时,它创建了一个不可变的列表,这意味着你不能修改它的元素或改变它的长度。但是,Dart的静态分析无法在编译期间捕获此错误,因为add方法是List对象上的有效方法,并且只有在运行时尝试修改不可变列表时才能检测到。
4条答案
按热度按时间k7fdbhmy1#
有关dart中const的含义,请参见this answer
TLDR常量变量由dart预编译,您无法在运行时修改它们。
字符串
使用final或var代替。
型
x7rlezfr2#
https://www.peachpit.com/articles/article.aspx?p=2468332&seqNum=5#:~:text=EXAMPLE%204.12&text= Unlike%20final%20variables%2C%20properties%20of,its%20values%20cannot%20be%20changed.
使用普通变量,与常量一样,在运行时不能更改列表的值。我假设这是用
var
或final
完成的,因为我自己不是 dart 大师。o8x7eapl3#
目前在Dart中没有办法指示一个方法是否改变了它的对象,或者保证不改变它。(这与C不同,在C中,一个方法可以标记为
const
,以表明它不会(明显地)改变对象。因此,Dart编译器没有好的方法来知道不应该允许在
const
对象上调用operator []=
,所以不幸的是,直到运行时才知道它违反了对象的const
特性。u5i3ibmn4#
当你使用const关键字声明一个列表时,它创建了一个不可变的列表,这意味着你不能修改它的元素或改变它的长度。但是,Dart的静态分析无法在编译期间捕获此错误,因为add方法是List对象上的有效方法,并且只有在运行时尝试修改不可变列表时才能检测到。