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

时间:2019-04-10 03:02:31

标签: 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
}

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

Three concatenated strings.

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

fun String.tripcon(s1: String,  s2: String){
    this= s1+s2+this
}

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

str3.tripcon(str1,str2)

它在一行中显示一条错误消息,指出期望的变量

this= s1+s2+this

所以我的问题是,是否可以在内部修改名为扩展功能的对象?还是有其他选择?谢谢!

1 个答案:

答案 0 :(得分:2)

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

即使可以,也不会为this分配新值。 this是您要扩展其行为的对象。然后,您无需修改​​该对象,而是尝试“替换”它或其他东西。坦率地说,我不知道如果Kotlin允许您这样做会导致什么。但事实并非如此。如果String并非一成不变,则您想要执行类似this.setValue(s1 + s2 + this)

的操作

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