[英]Why doesn't a string based template variable change in Kotlin?
我知道我可以在字符串k表达式中嵌入$aa
,因此第3行显示结果10。
我认为var k会在更改aa的值时发生变化,因此我认为第5行将显示结果15,但实际上它会显示10。为什么?
1 var aa=10
2 var k="$aa"
3 toast(k) //This is 10
4 aa=aa+5
5 toast(k) //This is 10, I think it should be 15
6 k="$aa"
7 toast(k) //This is 15
新增内容
我认为系统将在以下代码中重新计算第5行,因此我认为新值aa 15将嵌入到k中,但是实际上,我得到的结果是“ 10 bb”,为什么?
1 var aa=10
2 var k="$aa"
3 toast(k) //This is 10
4 aa=aa+5
5 k=k+" bb" //I think system will recalculate, so I think new value 15 will be embed into k
6 toast(k) //This is "10 bb", I think it should be "15 bb"
字符串是不可变的,引用k
指向特定的字符串“ 10”。 该字符串由变量aa
的内容值组成。
如果k
因突变而改变为aa
则将需要一些注意事项:
显示字符串的计算量很大。
为了连接我的两点,示例的最后一行将按您期望的方式进行评估,因为变量现在指向不同的字符串“ 15”,因为变量aa
持有的值与字符串构建时的值不同。
Kotlin没有“惰性求值”,并且var k = "$aa"
不是函数调用,它只是求值并立即赋值。 然后,当您要求var k = "$aa"
,将评估"$aa"
并分配k
。
之后, k
将“忘记”它的评估方式,因此您执行aa = aa + 5
将对k
无效。
对于“添加的内容”,基于上述相同的思想, k
被“忘记”了如何评估,分配k = k + " bb"
只会直接添加现有的 k
(程序级联接,而不是存储级串联)字符串“ bb”,而不用“ $ aa”重新评估k
。
当您写下这一行时:
var k = "$aa"
...赋值右侧的字符串模板将立即求值,分配给k
是模板本身的结果,即文字"10"
字符串。 该行与您在Java中拥有的相同,并且当然不会随着aa
的更新而自动更改:
String k = "" + aa;
String k = String.valueOf(aa);
String k = new StringBuilder().append(aa).toString();
为了每次都重新计算该值,可以引入一个局部函数,每次调用它一次来创建新的字符串,并将aa
的然后当前值插入模板:
var aa = 10
fun k() = "$aa" // same as: fun k(): String { return "$aa" }
println(k()) // 10
aa += 5
println(k()) // 15
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.