gpt4 book ai didi

scala - 使用 def 在 scala 中定义变量

转载 作者:行者123 更新时间:2023-12-04 13:39:34 29 4
gpt4 key购买 nike

在scala中,def用于定义方法,val、var用于定义变量。

考虑以下代码:

scala> def i = 3
i: Int

scala> i.getClass()
res0: Class[Int] = int

scala> val v = 2
v: Int = 2

scala> v.getClass()
res1: Class[Int] = int

scala> println(v)
2

scala> println(i)
3

scala> i+v
res4: Int = 5

scala> def o = () => 2+3
o: () => Int

scala> o.getClass()
res5: Class[_ <: () => Int] = class $$Lambda$1139/1753607449

为什么使用 def 可以定义变量?如果它正在定义返回 Int 的函数,那么为什么 getClass 显示 Int 而不是函数对象?

最佳答案

valvar 声明不同,def i = 3 不是变量声明。您正在定义一个返回常量 3 并且 i 不接受任何参数的方法/函数。

使用 valvar 的声明会立即求值,但在惰性 val 和 def 的情况下,求值会在显式调用时发生。

i 是一个非参数函数。为了避免混淆,您也可以使用空括号声明它

def i() = 3

lazy valdef 的区别是

  1. lazy val 被延迟计算并缓存结果。这意味着更进一步

  2. def 声明在您每次调用方法名称时都会被评估。

使用 Scala REPL 的示例

scala> lazy val a = { println("a evaluated"); 1}
a: Int = <lazy>

scala> def i = { println("i function evaluated"); 2}
i: Int

scala> a
a evaluated
res0: Int = 1

scala> a
res1: Int = 1

scala> a
res2: Int = 1

scala> i
i function evaluated
res3: Int = 2

scala> i
i function evaluated
res4: Int = 2

scala> i
i function evaluated
res5: Int = 2

请注意 a 仅被评估一次,并且 a 的进一步调用返回缓存的结果,即 lazy val 在被调用时被评估一次,结果是永久保存。所以你看到 println 输出一次

通知函数在每次调用时都会被评估。在这种情况下,每次调用函数时都会看到 println 输出

大会

有一个惯例,当方法有副作用时使用空参数列表,而当它是纯的时则不使用它们。

已编辑

scala> def i = 1
i: Int

scala> :type i
Int

scala> :type i _
() => Int

关于scala - 使用 def 在 scala 中定义变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40846036/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com