我在Scala def nullable: Boolean = true
中遇到过这个函数。我理解这个函数做了什么,但我想知道这种函数是否有特定的名称,以及没有使用var
答案 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)
使用def
或var/val
的主要区别在于值的执行时间。
def
定义值的名称,右边的值将在调用时执行(通过名称调用),这意味着它是懒惰的var
定义了一个值的名称,并且执行它的评估,急切地定义