【问题标题】:Scala function call with unknown default parameter具有未知默认参数的 Scala 函数调用
【发布时间】: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 设置为选项或检查其为空的位置找到了解决方法,但问题仍然存在。

【问题讨论】:

    标签: function scala default-value


    【解决方案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 类型。如果它忽略返回值(单位),那么最好以这种方式声明它;)。但这是一个单独的问题/问题。
    猜你喜欢
    • 1970-01-01
    • 2017-06-20
    • 1970-01-01
    • 2017-11-29
    • 1970-01-01
    • 2013-10-13
    • 2013-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多