首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >定义函数的"def“和"val”有什么区别?

定义函数的"def“和"val”有什么区别?
EN

Stack Overflow用户
提问于 2013-09-19 14:08:42
回答 6查看 63.1K关注 0票数 235

它们之间的区别是什么:

代码语言:javascript
复制
def even: Int => Boolean = _ % 2 == 0

代码语言:javascript
复制
val even: Int => Boolean = _ % 2 == 0

两者都可以像even(10)一样调用。

EN

回答 6

Stack Overflow用户

发布于 2017-06-08 04:26:16

请看以下内容:

代码语言:javascript
复制
  var x = 2 // using var as I need to change it to 3 later
  val sq = x*x // evaluates right now
  x = 3 // no effect! sq is already evaluated
  println(sq)

令人惊讶的是,这将打印4而不是9!val (even var)立即求值并赋值。

现在将val更改为def。它将打印9!Def是函数调用..它将在每次调用时进行计算。

票数 5
EN

Stack Overflow用户

发布于 2018-01-14 12:21:55

val,即"sq“由Scala定义是固定的。它是在声明时计算的,您不能在以后更改它。在其他示例中,even2也是val类型,但它使用函数签名声明,即"(Int => Boolean)",因此它不是Int类型。它是一个函数,它的值通过以下表达式设置

代码语言:javascript
复制
   {
         println("val");
         (x => x % 2 == 0)
   }

根据Scala val属性,您不能将另一个函数赋给even2,这与sq规则相同。

为什么调用eval2 val函数没有一次又一次地打印"val“?

原始代码:

代码语言:javascript
复制
val even2: (Int => Boolean) = {
             println("val");
             (x => x % 2 == 0)
       }

我们知道,在Scala的最后一条语句中,上面的表达式(里面是{ ..})实际上是返回到左侧。因此,您最终将even2设置为"x => x%2 == 0“函数,该函数与您为even2 val类型声明的类型相匹配,即(Int => Boolean),因此编译器很高兴。现在even2只指向"(x => x%2 == 0)“函数(而不是之前的任何其他语句,例如println("val")等。使用不同的参数调用event2将实际调用"(x => x%2 == 0)”代码,因为只有它与event2一起保存。

代码语言:javascript
复制
scala> even2(2)
res7: Boolean = true

scala> even2(3)
res8: Boolean = false

为了更清楚地说明这一点,下面是代码的不同版本。

代码语言:javascript
复制
scala> val even2: (Int => Boolean) = {
     |              println("val");
     |              (x => { 
     |               println("inside final fn")
     |               x % 2 == 0
     |             })
     |        }

会发生什么呢?在这里,当您调用even2()时,我们一次又一次地看到"inside final fn“被打印出来。

代码语言:javascript
复制
scala> even2(3)
inside final fn
res9: Boolean = false

scala> even2(2)
inside final fn
res10: Boolean = true

scala> 
票数 1
EN

Stack Overflow用户

发布于 2018-01-26 21:08:40

执行诸如def x = e之类的定义将不会计算表达式e,而是在调用x时计算e。

或者,Scala提供了一个值定义val x = e,它将计算右侧的值作为定义计算的一部分。如果随后使用x,则会立即将其替换为预先计算的e值,因此不需要再次计算该表达式。

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

https://stackoverflow.com/questions/18887264

复制
相关文章

相似问题

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