3

我正在尝试执行以下操作,但编译器不高兴...

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

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

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

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

4

4 回答 4

4

默认参数值有很多限制。

我建议重载:

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

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

我不确定确切的要求是什么,但我的快速测试表明你必须明确第二次重载的返回类型。

于 2013-02-23T03:31:24.847 回答
2

怎么样:

def foo(dbOption: Option[Database] = None)(implicit ctx: Context) {
  val db = dbOption.getOrElse(ctx.defaultDB)
  ...
}
于 2013-02-23T03:37:49.897 回答
1

怎么样

def foo(db: Database = implicitly[Context].defaultDB) = ???
于 2013-02-23T20:28:10.220 回答
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)会起作用,这很糟糕。

于 2013-02-23T03:24:53.963 回答