我正在尝试执行以下操作,但编译器不高兴...
def foo(db: Database = ctx.defaultDB)(implicit ctx: Context)
也就是说,如果未指定 db,则使用 ctx 查找默认值。编译器不喜欢这个版本,所以我尝试了这个:
def foo(ctx: Context, db: Database = ctx.defaultDB)
编译器也不喜欢这样...
我正在尝试执行以下操作,但编译器不高兴...
def foo(db: Database = ctx.defaultDB)(implicit ctx: Context)
也就是说,如果未指定 db,则使用 ctx 查找默认值。编译器不喜欢这个版本,所以我尝试了这个:
def foo(ctx: Context, db: Database = ctx.defaultDB)
编译器也不喜欢这样...
默认参数值有很多限制。
我建议重载:
def foo(db: Database)(implicit ctx: Context) = ...
def foo(implicit ctx: Context): Type = foo(ctx.defaultDB)(ctx)
我不确定确切的要求是什么,但我的快速测试表明你必须明确第二次重载的返回类型。
怎么样:
def foo(dbOption: Option[Database] = None)(implicit ctx: Context) {
val db = dbOption.getOrElse(ctx.defaultDB)
...
}
怎么样
def foo(db: Database = implicitly[Context].defaultDB) = ???
这个:
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)
会起作用,这很糟糕。