Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 个人科特林之谜:为什么它和b有不同的价值观?_Kotlin_Lambda - Fatal编程技术网

Kotlin 个人科特林之谜:为什么它和b有不同的价值观?

Kotlin 个人科特林之谜:为什么它和b有不同的价值观?,kotlin,lambda,Kotlin,Lambda,我是Kotlin的新手,我试图理解所显示的交换两个变量值的简短代码。 我不明白为什么它和b在ALLOW函数中有不同的值。它们不是引用了相同的内存地址和十进制值2吗 多谢各位 var a = 1 var b = 2 println("a=$a b=$b") // a=1 b=2 a = b.also { b = a println("it=$it b=$b") // it=2 b=1. Returns it } print("a=$a b=$b") // a=2 b=1 在

我是Kotlin的新手,我试图理解所显示的交换两个变量值的简短代码。 我不明白为什么它和b在ALLOW函数中有不同的值。它们不是引用了相同的内存地址和十进制值2吗

多谢各位

var a = 1
var b = 2
println("a=$a b=$b") // a=1 b=2
a = b.also { 
     b = a
     println("it=$it b=$b") // it=2 b=1. Returns it
}
print("a=$a b=$b") // a=2 b=1
在b中也是{it->b=a},它实际上是最终的。因此,它总是指向相同的值。

在b中,{it->b=a}它实际上是最终的。因此,它总是指向相同的值。

it变量不是b的别名,它是一个单独的变量,在执行lambda之前将b的值传递给它。您可以将其视为Kotlin隐式创建it变量,如下所示

a = b.also {
     val it = b // implicit
     b = a
     println("it=$it b=$b") // it=2 b=1. Returns it
}
这并不是实际发生的情况,但如果您这样看,它可能会帮助您理解为什么重新分配b不会影响b的值。

it变量不是b的别名,它是一个单独的变量,在执行lambda之前将b的值传递给它。您可以将其视为Kotlin隐式创建it变量,如下所示

a = b.also {
     val it = b // implicit
     b = a
     println("it=$it b=$b") // it=2 b=1. Returns it
}

这并不是实际发生的情况,但如果你这样看,可能会帮助你理解为什么重新分配b不会影响它的值。

它们不是引用相同的内存地址吗?它们不是。它包含一个值为b的副本。也是一个函数,因此,它使用标准的传递值样式。@dyukha,如果您尝试以下方法?这是否意味着Int在Kotlin中被视为基元类型?var original=mutableListOf1,2,3 var alterned=original.ally{it.add4}printlnated=$alterned//alterned=[1,2,3,4]printlnoriginal=$original//original=[1,2,3,4]它们没有引用相同的内存地址-它们没有。它包含一个值为b的副本。也是一个函数,因此,它使用标准的传递值样式。@dyukha,如果您尝试以下方法?这是否意味着Int在Kotlin中被视为基元类型?var original=mutableListOf1,2,3 var alterned=original.ally{it.add4}printlnatered=$alterned//alterned=[1,2,3,4]printlnoriginal=$original//original=[1,2,3,4]基于Int被视为基元类型的事实?因为当你传递一个参数时,比如说一个数组,你在它和调用者对象上提交的更改是相同的。这意味着它们在相同的内存地址上运行,对吗?它是最终的,不一定是不变的。不能重新分配它,但可以更改其内容。基于Int被视为基元类型这一事实?因为当你传递一个参数时,比如说一个数组,你在它和调用者对象上提交的更改是相同的。这意味着它们在相同的内存地址上运行,对吗?它是最终的,不一定是不变的。您不能重新分配它,但可以更改其内容。基于Int被视为基元类型或按值传递的事实,对吗?因为如果你传递一个对象,比如说一个数组,它们引用的是内存中的同一个对象和被调用的对象?因为如果你传递一个对象,比如说一个数组,它们会引用内存中的同一个对象,以及调用它的对象。