random()和{random()}之间有什么区别

  • 本文关键字:random 区别 之间 kotlin
  • 更新时间 :
  • 英文 :


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对象本身将始终是同一个实例。

所以,你自己的测试证实了他们是如何错误地描述这两种情况的。

最新更新