【问题标题】:kotlin string concatenation no side effectkotlin 字符串连接没有副作用
【发布时间】:2021-04-05 14:28:22
【问题描述】:

为什么保持字符串连接没有副作用?

fun main() {
    var s1 = "abc"
    val s2 = "def"
    s1.plus(s2)
    println(s1)
    // s1 = s1.plus(s2)
    // println(s1)
}

我期待abcdef,但得到了abc。注释代码工作正常,但看起来很尴尬。

【问题讨论】:

    标签: string kotlin concatenation


    【解决方案1】:

    plus() 方法(或 + 运算符,在 kotlin 中基本相同)返回连接的字符串。所以通过调用

    s1.plus(s2)
    //or
    s1 + s2
    

    您将这些字符串连接起来,但您丢弃了结果。

    【讨论】:

    • 我想我想问为什么在 kotlin 中没有+=
    • @OrenIshShalom 你确定吗? Kotlin docs
    • 值得指出的是 += 无论如何都是两个组合操作,plus(它不会改变或改变原始值)然后将结果分配给变量,而不是原始值(被丢弃)。 Kotlin 有一些函数可以改变原始函数(通常是 Collection)以及一个等价函数,它只是创建一个带有更改的副本,但 Strings 始终是不可变的(在 Java 中也是如此)
    • @Alex.T,我认为您应该将其发布为答案。 Kotlin 的新手(比如我自己)可能会从这个简短的答案中受益。
    【解决方案2】:

    正如answer 所示。您的加号操作返回独立于给定字符串的连接字符串。这是因为字符串在 Kotlin 中是不可变的。另一种方法是使用 CharLists 或缓冲区。

    请注意,不变性有一些重要的好处。使用不可变性,放弃对不可变对象的引用是没有问题的,因为没有人可以更改对象。您需要更改模型中的引用以保持新值。这种方式有助于保证模型的一致性和完整性。另请注意,由于这个原因,不可变对象是线程安全的。

    【讨论】:

      猜你喜欢
      • 2021-08-02
      • 2014-07-20
      • 1970-01-01
      • 1970-01-01
      • 2013-09-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多