我尝试做类似以下的事情,编译器不满意......
def foo(db: Database = ctx.defaultDB)(implicit ctx: Context)
也就是说,如果未指定db,请使用ctx查找默认值。编译器不喜欢这个版本,所以我尝试了这个:
def foo(ctx: Context, db: Database = ctx.defaultDB)
编译器也不喜欢......
答案 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) = ???