首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >random()和{random()}有什么区别?

random()和{random()}有什么区别?
EN

Stack Overflow用户
提问于 2021-04-28 18:43:58
回答 1查看 69关注 0票数 0

上述教程测验问题中的https://classroom.udacity.com/courses/ud9011/lessons/14fb1ae9-8a2e-48ee-9620-68c87c5f833b/concepts/7ce11834-0ff4-4dc9-8b89-81309af23424

它们之间的区别是什么

val random1 = random() val random2 = {random()}

在REPL或文件中尝试它:教程的答案是: random1在编译时分配了一个值,当访问变量时,该值永远不会改变。

random2在编译时分配了一个lambda,每次引用变量时都会执行lambda,并返回一个不同的值。

我确实在PERL中尝试过,但我得到了

代码语言:javascript
复制
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新手,您可以从我的问题中看出,请在您回答时详细说明一下。

代码语言:javascript
复制
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)
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-28 19:46:32

如果你从字面上引用Udacity,他们的解释是错误的。random1的值不是在编译时赋值的,因为random()是在运行时第一次使用该类时调用的。只有在那时才会分配它的值。之后,在同一应用程序会话中,该值将保持不变。但是,在应用程序的不同会话中,相同编译的应用程序将具有不同的值。

并且并不是每次引用变量时都执行random2的lambda。只有在通过调用invoke() (或等效运算符)调用它时,才会执行它。lambda对象本身始终是相同的实例。

因此,您自己的测试证实了他们如何错误地描述了这两种情况。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67298705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档