【问题标题】:How does one modify the object itself from which an extension function has been called?如何修改调用扩展函数的对象本身?
【发布时间】:2019-04-10 03:02:31
【问题描述】:

所以我对 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)

它会在行中显示 Variable expected 的错误:

this= s1+s2+this

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

【问题讨论】:

    标签: kotlin


    【解决方案1】:

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

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

    str3 = str3.tripcon(str1,str2) 有效,因为tripcon 正在构造一个新字符串,然后您将该新字符串分配给引用str3

    【讨论】:

    • 啊,我明白了!双引号内的任何内容都是常数,因此是不可变的。当我分配 str3 = str3.tripcon(str1,str2) 时,str3 引用变量只是“指向”另一个拥有值为 str1+str2+“strings”的 String 对象。
    • 是的,你明白了!
    猜你喜欢
    • 2015-03-09
    • 1970-01-01
    • 2012-06-10
    • 2012-10-28
    • 2017-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多