You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scala中用val定义函数时,为何Random.nextInt每次调用都会重新计算?

为什么用val绑定Random.nextInt这类函数时,每次调用仍会生成新结果?

这问题问得特别精准!很多刚接触Scala的开发者都会被val/def的区别和这类方法调用的行为搞混,我来给你拆解明白:

核心误区:val绑定的是函数实例,不是函数执行结果

首先得明确val和def定义函数的本质差异:

  • def定义的是方法的声明,每次调用def标记的方法时,都会从头执行一遍方法体的逻辑。
  • val定义的是对某个对象的绑定——当你用val绑定一个函数时,你固定的是「这个函数本身的引用」,而不是「调用这个函数后得到的结果」。

以Random.nextInt为例具体分析

当你写类似下面的代码时:

import scala.util.Random
val nextIntFunc: () => Int = Random.nextInt

这里的val nextIntFunc绑定的是Random.nextInt对应的函数实例(Scala会自动把类中的方法转换为函数对象,这个过程叫eta展开)。而Random.nextInt本身的逻辑就是每次执行时生成一个全新的随机整数——val只是帮你固定了「我要调用的是这个生成随机数的函数」,但函数自身的执行逻辑并不会因为被val绑定而改变。

如果换一种写法,直接绑定函数调用的结果:

val fixedRandomNum = Random.nextInt

这时候fixedRandomNum就是一个固定的Int值了——因为你绑定的是调用一次Random.nextInt后得到的具体结果,而不是函数本身。

总结一下

val的“仅定义一次”指的是「绑定的对象不会变」:

  • 如果绑定的是函数实例,那每次调用这个函数,都会执行它原本的逻辑(比如Random.nextInt生成新随机数)
  • 如果绑定的是函数调用的结果,那这个结果才会固定不变

内容的提问来源于stack exchange,提问作者J Markus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:00:00