gpt4 book ai didi

scala - 在 Scala 中,通过名称参数调用的函数与将另一个函数作为参数的函数不同吗?

转载 作者:行者123 更新时间:2023-12-04 06:07:58 25 4
gpt4 key购买 nike

首先,我有这个功能:

def number5()={
println("number 5 starting")
println("number 5 exiting")
5
}

然后:

def giveMeCallByNameParameter(f: =>Int)={
println("starting")
f
println("exiting")
}

当我调用它时:

giveMeCallByNameParameter(number5)

我得到这个结果:

starting
number 5 starting
number 5 exiting
exiting

如果我也有这个功能:

def giveMeAnotherFunction(f: ()=>Int)={
println("starting")
f()
println("exiting")
}

我称之为:

giveMeAnotherFunction(number5)

我得到了相同的结果:

starting
number 5 starting
number 5 exiting
exiting

那么,它们有什么不同吗?除了有没有括号的区别?

如果他们不一样呢?那为什么我们要叫这个术语呢?

最佳答案

按名称的参数可以是任何有效的表达式。函数也是有效的表达式,但只是一种表达式。

按名称参数和按值参数之间的最大区别在于,按值参数是最常见的函数参数类型,被传递到函数之前进行评估。 By-name parameters 的评估被延迟到至少在被传递到函数之后。函数本身可能会也可能不会评估参数,它没有义务这样做。

碰巧函数具有相同类型的属性,但同样,正如我之前所说,函数只是一种表达式,而按名称的参数可以采用任何类型的有效表达式。

按名称参数的一个很好的用例是构建自定义断言函数:

def byNameAssert(predicate: => Boolean) =
if (assertionsEnabled && !predicate)
throw new AssertionError

这样,您可以通过控制 assertionsEnabled 值来关闭断言条件的评估。

如果未启用断言,您甚至可以拥有一个通常会抛出异常但不会产生异常的表达式:

byNameAssert(x/0 == 0)

另请注意,表达式 x/0 == 0 不是函数!按名称的参数可以采用任何类型的表达式,但至少会推迟到函数被调用之后对其求值。

希望这对您有所帮助!

关于scala - 在 Scala 中,通过名称参数调用的函数与将另一个函数作为参数的函数不同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26019534/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com