具有未知默认参数的 Scala 函数调用

Posted

技术标签:

【中文标题】具有未知默认参数的 Scala 函数调用【英文标题】:Scala function call with unknown default parameter 【发布时间】:2014-02-27 01:39:39 【问题描述】:

假设我有一个不可编译的(是的,我知道它不能被编译,因为 func())代码

 def withCondition(func: (Nothing) => Int): Unit = 
     if (someExtConditionIsTrue) func()

但我想与这个包装器一起使用的功能看起来像

def func(a: Int = 5) = a * 2

有什么方法可以在包装器中使用它自己的 default 参数调用像这样的函数,而我不知道该函数到底是什么以及它的默认参数值是什么?

P.S.:我通过将 a 设置为选项或检查其为空的位置找到了解决方法,但问题仍然存在。

【问题讨论】:

【参考方案1】:

这是一个合法的函数,它正确地使用了默认参数:

def func(a: Int = 5) = a * 2

这个函数的类型是:Int => Int

此代码无法编译:

def withCondition(func: (Nothing) => Any): Unit = 
  if (someExtConditionIsTrue) func()

因为您的func 预计会传递Nothing 类型的东西。也许你的意思是有一个不带参数的函数:

def withCondition(func: => Int): Unit =
  if (someExtConditionIsTrue) func()

或者您可以将默认参数“推送”到包装函数:

def withCondition(func: Int => Int, a: Int = 5): Unit =
  if (someExtConditionIsTrue) func(a)

// call it:
withCondition(func)

您可以尝试使用隐式参数而不是默认参数,如下所示:

implicit val defaultArg = 5

然后:

def withCondition(func: Int => Int)(implicit a: Int): Unit = func(a)

或直接传给func:

def func(implicit a: Int) = a * 2

编辑

要调用具有默认参数的函数,您可以使用:

scala> def withCondition(func: => Int): Unit = println(func)
withCondition: (func: => Int)Unit

scala> def func(a: Int = 5) = a * 2
func: (a: Int)Int

scala> withCondition(func())
10

// or

scala> withCondition(func(3))
6

如果你使用这种形式:def withCondition(func: => Int) 那么这意味着它需要一个返回 Int 且不带参数的函数。在这种情况下,您必须在将函数传递给包装函数之前为该函数提供该值,因为包装函数不能将任何参数传递给不接受参数的函数。在您的情况下,您可以通过使用默认 arg 或通过显式将 arg 传递给 func 来实现这一点,就像上面的示例一样。

【讨论】:

因此有句话,“你不能从无中获得一些 Int”。 Aleksey,当你不知道这个函数到底是什么的时候,如何用它自己的默认值调用这个函数。这就是包装器被声明为未指定的原因。 所以现在我想我已经描述了各种选项。我唯一要改变的是找出正确的func arg 类型。如果它忽略返回值(单位),那么最好以这种方式声明它;)。但这是一个单独的问题/问题。

以上是关于具有未知默认参数的 Scala 函数调用的主要内容,如果未能解决你的问题,请参考以下文章

Scala - 柯里化和默认参数

scala 基础四 scala 的函数扩展 默认参数,不定长参数,带名参数

调用具有未知数量参数Python的函数

Scala主函数的默认参数?

Scala API中的选项和命名默认参数是不是像油和水?

Scala编程基础