如何修改调用扩展函数的对象本身?

5 kotlin

所以我对 Kotlin 编程还是很陌生,在学习教程时,我偶然发现了扩展函数的主题。本教程提供了一个使用扩展函数(比如 tripcon)一次连接三个字符串的示例,如下所示:

fun main() {
    val str1="Three "
    val str2="concantenated "
    var str3="strings."
    str3 = str3.tripcon(str1,str2)
    println(str3)
}

fun String.tripcon(s1: String,  s2: String) : String{
    return s1 + s2 + this
}
Run Code Online (Sandbox Code Playgroud)

上面的代码将给出正确的输出

Three concatenated strings.
Run Code Online (Sandbox Code Playgroud)

但是,如果我将 tripcon() 函数修改为:

fun String.tripcon(s1: String,  s2: String){
    this= s1+s2+this
}
Run Code Online (Sandbox Code Playgroud)

随后将 main() 函数中的倒数第二行修改为:

str3.tripcon(str1,str2)
Run Code Online (Sandbox Code Playgroud)

它会出现一个错误,指出行中的预期变量

this= s1+s2+this
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,是否有可能在其中修改调用了扩展函数的对象?或者还有其他选择吗?谢谢!

Ste*_*eve 5

字符串是不可变的。您永远无法在扩展函数内或其他方式修改字符串。

即使可以,您也不会为 分配新值thisthis是您要扩展其行为的对象。然后你就不会修改该对象,而是尝试“替换”它,或者其他什么。坦率地说,我不知道如果 Kotlin 让你这样做会产生什么结果。但事实并非如此。如果 String 不是不可变的,你会想做类似的事情this.setValue(s1 + s2 + this)

str3 = str3.tripcon(str1,str2)之所以有效,tripcon是因为正在构造一个新的 String,然后将该新的 String 分配给引用str3