[英]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.