【问题标题】:leaving out some implicit parameters省略一些隐式参数
【发布时间】:2013-07-02 06:39:03
【问题描述】:

是否可以省略一些隐式参数但不是全部?我尝试使用命名参数:

def foo(implicit a: Int, b: String) {
  if (a > 0) {
    println(b)
    foo(a = a-1)   // error
  }
}

不幸的是,编译器拒绝了foo 的递归调用:

not enough arguments for method foo
Unspecified value parameter b

【问题讨论】:

    标签: scala implicit named-parameters


    【解决方案1】:

    不确定您要达到的目标,但可以这样做:

    def foo(implicit a: Int, b: String): Unit = {
      def helper(a: Int)(implicit b: String): Unit =
        if (a > 0) {
          println(b)
          helper(a - 1)
        }
      helper(a)
    }
    

    【讨论】:

    • 聪明!你们之间的次数超过 60k,你也让我觉得自己很聪明,就像听莫扎特一样。
    • @LuigiPlinge 事实上,你聪明的柯里化让我也想尝试一些东西,我非常感谢你。您可能会反对说我的解决方案不是非常聪明,但莫扎特是否抱怨所有听他音乐的婴儿都变笨了?
    【解决方案2】:

    不能省略一些隐式参数。所以,在你的例子中

    def foo(implicit a: Int, b: String): Unit = ???
    

    不能只指定a。不过可以指定隐式参数的默认值,例如

    def foo(implicit a: Int, b: String = "---"): Unit = ???
    

    如果b 不是隐式可用的,则将使用"---"

    请记住,implicit 关键字将参数列表标记为隐式,而不是将一个参数标记为隐式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      相关资源
      最近更新 更多