匿名函数的`def`和`var/val`之间有什么区别?

14 浏览
0 Comments

匿名函数的`def`和`var/val`之间有什么区别?

对于以下匿名函数定义,我感到困惑:

var plusOne = (x:Int)=>x+1

// 或者 val plusOne=(x:Int)=>x+1

println(plusOne(2))

或者

def plusOne = (x:Int)=>x+1

println(plusOne(2))

请问在函数名之前使用var/val和def有什么区别。

0
0 Comments

在匿名函数中,使用defvar/val有什么区别?

val声明了一个 "不可变的变量或者说是符号",不允许重新赋值,赋值语句的右侧会立即被计算。

var声明了一个 "可变的变量",允许以后重新赋值给该变量,赋值语句的右侧会立即被计算,和val类似。

def声明了一个 "不可变的符号",不允许重新赋值,赋值语句的右侧被懒惰地计算,即在代码中稍后引用该符号时计算。

例如:

var plusOneVar = (x:Int) => x+1
val plusOneVal = (x:Int) => x+1
def plusOneDef = (x:Int) => x+1
plusOneVar = (x:Int) => x+2 // 可以重新赋值给var
plusOneVal = (x:Int) => x+2 // 编译时错误,不能重新赋值给val
plusOneDef = (x:Int) => x+2 // 编译时错误,不能重新赋值给def

因为你正在看一个函数的示例,很难理解。让我们尝试用简单的变量来理解。

var symbolVar = 100        // 第一行
val symbolVal = symbolVar  // 第二行
def symbolDef = symbolVar  // 第三行
println(symbolVar)  // 输出 100
println(symbolVal)  // 输出 100
println(symbolDef)  // 输出 100 - 还没有惊喜
symbolVar = symbolVar + 1
println(symbolVal)  // 仍然输出 100,因为它在第二行被计算和赋值
println(symbolDef)  // 输出 101,因为symbolDef是一个def,它依赖于symbolVar,第三行被重新计算

0
0 Comments

问题出现的原因是在于理解匿名函数的定义和使用中,使用defval/var的区别。解决方法是进行实例化和调用测试。

在代码中,使用def定义了一个匿名函数f,该函数接受一个Int类型的参数i,并返回i+1。然后使用val g = f _将函数f赋值给g

通过测试我们可以发现,使用def定义的匿名函数每次调用都会创建一个新的实例,而使用val定义的匿名函数只会创建一个实例,并且可以被多次调用。

下面我们通过实例化和调用来验证这一结论:

def f (i:Int) = i+1

val g = f _

println(f(1)) // 输出:2

println(g(2)) // 输出:3

println(g(3)) // 输出:4

从上面的输出结果可以看出,使用def定义的匿名函数每次调用都会创建一个新的实例,而使用val定义的匿名函数只会创建一个实例,并且可以被多次调用。

因此,defval/var在匿名函数的定义和使用中是有区别的。

0
0 Comments

var plusOne可以重新分配,val plusOne不能重新分配。两者都只计算一次。def plusOne每次调用时都会计算。

好的,var plusOne变成了val plusOne,请问与def有什么区别呢?:)

抱歉,我无法理解,请给一个简单的示例代码。非常感谢!

您可能希望更清楚地说明每次计算一次与每次计算的具体内容。

0