在Scala中,通过名称参数进行调用的函数是否与以另一个函数作为参数的函数不同?

Cui Pengfei 崔鹏飞

说,首先,我有这个功能:

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

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

如果他们没有不同?那为什么我们要用名称来称呼这个术语呢?

丹尼尔·米拉迪诺夫(Daniel Miladinov)

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

别名参数和按值参数之间的最大区别在于,按值参数(最常见的一种函数参数)传递到函数之前先进行值。至少在传递给函数之后,按名称参数的评估才延迟。函数本身不一定会评估参数,也不一定会评估参数。

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

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

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

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

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

byNameAssert(x / 0 == 0)

还要注意,表达式x / 0 == 0不是函数!按名称的参数可以采用任何形式的表达式,但是至少在调用该函数之后才将其求值时间延长。

希望这可以帮助!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

函数参数作为另一个函数的名称?

在Swift中是否可以将一个函数作为另一个函数的参数来调用?

将参数传递给由另一个函数在 R 中通过其名称调用的函数

在类中以另一个函数作为参数调用函数

如何调用在另一个函数中作为参数传递的函数

接收函数作为另一个函数的参数

PHP函数作为另一个函数的参数

通过在Perl中传递参数通过eval调用另一个函数

如何将一个函数作为参数传递给另一个通过React中的列表进行映射的函数?

如何通过优化函数传递常数参数,该优化函数调用R中的另一个函数?

将函数参数作为参数传递给python中的另一个函数

使用另一个函数作为参数的Javascript函数调用

如何在另一个函数内调用多个函数作为参数?

在另一个函数中调用一个函数的参数

比在另一个函数的参数中调用一个函数更昂贵?

对以另一个函数作为参数的函数进行 JSDoc 注释

是否有惯用的无点方法通过另一个函数调用带有参数的函数

Python:通过另一个函数中的参数对列表进行排序

在另一个函数中进行的函数调用的覆盖参数

检查是否可以使用另一个函数的参数调用该函数

在另一个函数中传递的函数参数

从另一个函数调用参数调用alloca()?

从C ++ 17中的另一个构造函数调用具有不同参数类型的构造函数

R:通过设置其他参数,将多个参数中的一个作为一个参数传递给另一个函数

如何通过python中的另一个函数调用具有命名参数的函数?

使用数组作为参数仅通过第一个元素(JSON RPC)调用PHP中的另一个函数

Mockito - 如何单元测试参数是否在另一个函数调用的函数中设置

haskell 另一个函数作为输入参数

作为另一个函数的参数