为什么在val上使用没有参数列表的方法

时间:2017-11-20 16:58:25

标签: scala

我在Scala def nullable: Boolean = true中遇到过这个函数。我理解这个函数做了什么,但我想知道这种函数是否有特定的名称,以及没有使用var

的动机是什么

2 个答案:

答案 0 :(得分:7)

首先,我在scala中会非常精确:使用单词 Function 来表示FunctionN的实例并在谈话时使用单词 Method 关于def(可能有零个或多个参数列表)。其次,这绝对是确实有一个正文(尽管没有括在括号中)。它的主体是表达式true(即一个布尔文字)。

我认为你真的要问:“为什么使用没有参数列表的方法而不是val?”

在决定是否代表某个类的属性时,您可以在方法和值之间进行选择(建议:避免使用var)。通常,如果属性没有副作用,我们可以使用没有参数列表的def(scala惯用法是带有单个空参数列表的def意味着副作用)。

因此我们可以选择以下任何一种,所有这些在使用现场都是语义上等效的(性能特征除外):

case class Foo(s: String) {
  //Eager - we calculate and store the value regardless of whether
  //        it is ever used 
  val isEmpty = s.isEmpty
}

case class Foo(s: String) {
  //Lazy - we calculate and store the value when it
  //       it is first used 
  lazy val isEmpty = s.isEmpty
}

case class Foo(s: String) {
  //Non-strict - we calculate the value each time
  //             it is used 
  def isEmpty = s.isEmpty
}

因此我们可能会采取以下建议

  • 如果计算值昂贵,我们相信我们会多次使用它,请使用val
  • 如果该值的计算成本很高,我们可能会使用零次或多次,请使用lazy val
  • 如果该值太贵,我们认为它通常会使用一次,请使用def

然而,还有一个额外的考虑因素;使用val(或lazy val)使用IDE通常可以显示有利于调试,通常可以在检查窗口中显示任何范围内val s

的值

答案 1 :(得分:0)

使用defvar/val的主要区别在于值的执行时间。

  • def定义值的名称,右边的​​值将在调用时执行(通过名称调用),这意味着它是懒惰的
  • var定义了一个值的名称,并且执行它的评估,急切地定义