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)

正確な要件が何であるかはわかりませんが、私の簡単なテストでは、2番目のオーバーロードの戻り型を明示的にする必要があることが示唆されています。

于 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(ctx:Context)(db:Database = ctx.defaultDB )

もちろん、それは暗黙的ではありません。次のようなトリックで暗黙的にすることができるかもしれません:

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

ただし、暗黙的にfoo(x)渡され、エラーが発生するため、期待どおりに機能しません。動作するだけで、それは最悪です。xfoo()(x)foo.apply(x)

于 2013-02-23T03:24:53.963 に答える
1

どうですか

def foo(db: Database = implicitly[Context].defaultDB) = ???
于 2013-02-23T20:28:10.220 に答える