为什么在Scala中使用def和val,反之亦然

为什么在Scala中使用def和val,反之亦然,scala,Scala,我知道这在以前的其他帖子中已经讨论过了,我理解def和val的基本区别def用于定义方法,val用于不可变引用。我想通过问这个问题来了解是否还有更多的东西需要定义。它能否与val互换使用 最近我尝试了以下代码,但无法说服自己目前对def的理解是否足够: scala> def i: Int = 3 i: Int scala> i res2: Int = 3 所以我很好奇,这等于vali=3 然后我试了一下: scala> i() <console>:9: erro

我知道这在以前的其他帖子中已经讨论过了,我理解
def
val
的基本区别
def
用于定义方法,
val
用于不可变引用。我想通过问这个问题来了解是否还有更多的东西需要定义。它能否与
val
互换使用

最近我尝试了以下代码,但无法说服自己目前对
def
的理解是否足够:

scala> def i: Int = 3
i: Int

scala> i
res2: Int = 3
所以我很好奇,这等于
vali=3

然后我试了一下:

scala> i()
<console>:9: error: Int does not take parameters
i()
这次Scala似乎同意
i
是一种方法。因此,我可以使用
def
代替
val
来声明和初始化变量吗?

两者都可以

def i = 3

声明方法。唯一的区别是,第一个是没有参数列表的方法,第二个是有空参数列表的方法。前者通常用于无副作用的方法,后者用于有副作用的方法。
如果值从未更改并且希望避免重新计算,则应使用val而不是def。def在每次调用时都会重新计算,而val只分配一次值。

只需在Kim答案的顶部添加一个值,就可以用val覆盖def

// Entering paste mode (Ctrl+D to finish)

trait A {
  def i: Int
  def num: Long
}

class B extends A {
  val i = 7
  val num = 20L
}

// Exiting paste mode, now interpreting.

defined trait A
defined class B

scala> val b = new B
b: B = B@2d62bdd8

scala> b.i
res1: Int = 7

scala> b.num
res2: Long = 20

def
定义了一个方法,
val
定义了一个不可变的值,您已经知道了

一个主要区别在于计算
=
右侧的表达式的时间。对于方法,每次调用该方法时都会对其求值。对于值,将在初始化该值时对其求值。请看区别:

scala> def i: Int = { println("Hello"); 3 }
i: Int

scala> i
Hello
res0: Int = 3

scala> i
Hello
res1: Int = 3

scala> val i: Int = { println("Hello"); 3 }
Hello
i: Int = 3

scala> i
res2: Int = 3

只是为了再次迭代,您可以对任何不带参数的方法使用parens或no-parens,对具有副作用的方法使用parens是“唯一”约定,但我强烈建议您遵循它。但是,如果您正在执行类似于
def dontdoathis=println(“Hi!”)
正确答案的操作,编译器不会阻止您。扩展这个逻辑,我可以说val list=list(1,2,3),然后我可以调用list.size()或list.length()。这两种方法都没有副作用,对吗?因此,我也可以这样调用它们:list.size或list.length您可以调用使用
()
声明的方法,但不能调用使用括号声明的方法。我明白了。微妙且有意义。仅供参考:您可以使用任意数量的空参数列表定义方法:
defi()()=3
。请在离开SOF后阅读您的注释。非常有用的输入。回答很好。请参见我关于
def
val
var
之间差异的回答:Scala中的可能性!val覆盖def。我不知道。
// Entering paste mode (Ctrl+D to finish)

trait A {
  def i: Int
  def num: Long
}

class B extends A {
  val i = 7
  val num = 20L
}

// Exiting paste mode, now interpreting.

defined trait A
defined class B

scala> val b = new B
b: B = B@2d62bdd8

scala> b.i
res1: Int = 7

scala> b.num
res2: Long = 20
scala> def i: Int = { println("Hello"); 3 }
i: Int

scala> i
Hello
res0: Int = 3

scala> i
Hello
res1: Int = 3

scala> val i: Int = { println("Hello"); 3 }
Hello
i: Int = 3

scala> i
res2: Int = 3