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

Joh*_*ass 1 scala

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

oxb*_*kes 7

首先,我在scala中会非常精确:使用单词Function来表示一个实例FunctionN并在谈论a时使用单词Methoddef(可能有零个或多个参数列表).其次,这绝对确实有一个身体(尽管没有括在括号内).它的主体是表达式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
}
Run Code Online (Sandbox Code Playgroud)

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

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

但是,还有一个额外的考虑因素; 使用val(或lazy val)可能有利于使用IDE 进行调试,通常可以在检查窗口中向您显示任何范围内val的值