Scala默认参数来自其他参数

时间:2013-02-23 03:06:07

标签: scala

我尝试做类似以下的事情,编译器不满意......

def foo(db: Database = ctx.defaultDB)(implicit ctx: Context)

也就是说,如果未指定db,请使用ctx查找默认值。编译器不喜欢这个版本,所以我尝试了这个:

def foo(ctx: Context, db: Database = ctx.defaultDB)

编译器也不喜欢......

4 个答案:

答案 0 :(得分:4)

默认参数值有许多限制。

我建议超载:

def foo(db: Database)(implicit ctx: Context) = ...

def foo(implicit ctx: Context): Type = foo(ctx.defaultDB)(ctx)

我不确定具体要求是什么,但我的快速测试表明你必须明确地在第二个重载上返回类型。

答案 1 :(得分:2)

怎么样:

def foo(dbOption: Option[Database] = None)(implicit ctx: Context) {
  val db = dbOption.getOrElse(ctx.defaultDB)
  ...
}

答案 2 :(得分:1)

此:

def foo(ctx:Context)(db:Database = ctx.defaultDB )

当然,这不是隐含的。你可以用这样的技巧隐藏它:

def foo(implicit ctx:Context) = {
  class XXX {
    def apply(db:Database = ctx.defaultDB) = ...
  }
  new XXX(ctx)
}

但是,这不会像您期望的那样有效,因为foo(x)会将x作为隐式传递,而foo()(x)会产生错误。只有foo.apply(x)才有效,而且很糟糕。

答案 3 :(得分:1)

怎么样

def foo(db: Database = implicitly[Context].defaultDB) = ???
相关问题