https://classroom.udacity.com/courses/ud9011/lessons/14fb1ae9-8a2e-48ee-9620-68c87c5f833b/concepts/7ce11834-0ff4-4dc9-8b89-81309af23424来自以上教程测验问题
有什么区别
val random1=随机((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总是打印为";函数0<java.lang.Integer>";。我想教程的答案是正确的。为什么我的代码显示与教程答案不同?random((和{random((}之间有什么区别?请详细说明一下你的回答,因为我是科特林的新手,你可以从我的问题中看出。
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)
}
如果你真的引用了Udacity,他们的解释是错误的。random1
的值在编译时没有赋值,因为random()
是在首次使用类时在运行时调用的。只有这样,它的值才会被赋值。之后,在同一个应用程序会话中,该值将保持不变。但同一个编译后的应用程序在应用程序的不同会话上会有不同的值。
并且random2
的lambda并不是每次引用变量时都执行的。只有当通过调用invoke()
(或等效运算符(来调用它时,才会执行它。lambda对象本身将始终是同一个实例。
所以,你自己的测试证实了他们是如何错误地描述这两种情况的。