它们之间的区别是什么
val random1 = random() val random2 = {random()}
在REPL或文件中尝试它:教程的答案是: random1在编译时分配了一个值,当访问变量时,该值永远不会改变。
random2在编译时分配了一个lambda,每次引用变量时都会执行lambda,并返回一个不同的值。
我确实在PERL中尝试过,但我得到了
error: unresolved reference. None of the following candidates is applicable because of receiver type mismatch:
public inline fun <T> Array<out TypeVariable(T)>.random(): TypeVariable(T) defined in kotlin.collections所以我写了代码来测试教程答案,但我得到了与教程答案相反的结果。
每次引用变量时都会执行random1,并返回一个不同的值。random2始终打印为"Function0“。我猜教程的答案是正确的。为什么我的代码显示与教程答案不同?random()和{random()}有什么区别?由于我是kotlin新手,您可以从我的问题中看出,请在您回答时详细说明一下。
fun main(args: Array<String>) {
gamePlay(rollDice())
}
val rollDice = {Random().nextInt(3)+1}
val random1 = Random().nextInt(3)
val random2 = {Random().nextInt(3)}
fun gamePlay(XXXdiceRoll:Int){
// do something with the dice roll
println(XXXdiceRoll)
println(XXXdiceRoll)
println(random1)
println(random1)
println(random2)
println(random2)
}发布于 2021-04-28 19:46:32
如果你从字面上引用Udacity,他们的解释是错误的。random1的值不是在编译时赋值的,因为random()是在运行时第一次使用该类时调用的。只有在那时才会分配它的值。之后,在同一应用程序会话中,该值将保持不变。但是,在应用程序的不同会话中,相同编译的应用程序将具有不同的值。
并且并不是每次引用变量时都执行random2的lambda。只有在通过调用invoke() (或等效运算符)调用它时,才会执行它。lambda对象本身始终是相同的实例。
因此,您自己的测试证实了他们如何错误地描述了这两种情况。
https://stackoverflow.com/questions/67298705
复制相似问题