我知道Pair在Kotlin中是一成不变的。问题是,论证在科特林中也是一成不变的。所以当我得到这样的代码时。
fun bind(pair: Pair<String, Boolean>) {
// Change pair value here
}
pair = pair.copy()在这里不起作用。我不知道该怎么办。
答案 0 :(得分:2)
您无法写入pair
值本身,因为它是immutable,而是像这样创建该值的副本:
val pair2 = pair.copy()
并使用pair2
值代替pair
本身。
另请参阅this helpful answer。
答案 1 :(得分:1)
由于Pair
是不可变的,因此您不能只替换对值,除非您正在使用反射。将Pair
更改为可变或坚持使用,然后返回新的Pair
而不是使用copy
(仅设置一些值)或以下命令:
fun bind(pair: Pair<String, Boolean>) = pair.let { (left, right) -> // destructuring
// exchange pair values here... just showing a sample:
left.toInt() to right.toString() // this is basically the same as Pair(left.toInt(), right.toString())
} // in this example it returns a Pair<Int, String>
虽然您可能会引入自己的MutablePair
类,但我宁愿坚持不变性,并修改您的代码以适当地处理它。可变性可能是一个问题;甚至在其他人不希望您的人变对的情况下。
答案 2 :(得分:0)
您可以使用copy()
创建更改后的副本。 (适用于每个data-class.)
fun bind(pair: Pair<String, Boolean>) {
val pairCopy = pair.copy(first = "something else")
}
然后在以下代码中使用pairCopy
。