具有未知默认参数的 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 函数调用的主要内容,如果未能解决你的问题,请参考以下文章