簡體   English   中英

為什么Kotlin中基於字符串的模板變量沒有變化?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM