3

このケースクラスを考えてみましょう。

case class IntPrinter(implicit val i: Int) {
  def print()(implicit i: Int) = println(i)
}

次のように、暗黙の引数の値を明示的に渡してインスタンス化できます。

val p = IntPrinter()(9)

IRCで、今後、明示的に渡された値は、呼び出されたときに暗黙的に印刷に渡されると言われていますが、そうではありません。

p.print()
 error: could not find implicit value for parameter i: Int

私は何か間違ったことをしているのですか、それとも間違った情報を誤解している/与えられているのですか?これを達成する方法はありますか?


編集:実際のところ、私p._がこのようにインポートすると、期待どおりに機能します:

import p._
p.print()

これは確かに印刷され9ます。

これは正しい動作ですか?importそれが聞こえるほど悪い考えを使用していますか?これを回避するにはどうすればよいですか?

4

2 に答える 2

1

私は上手く理解できていない気がします。ここで暗黙が必要なのはなぜですか?これも同じくらい簡単にできるようです。

scala> case class IntPrinter(i: Int) { def print() = println(i) }
defined class IntPrinter

scala> val p = IntPrinter(9)
p: IntPrinter = IntPrinter(9)

scala> p.print()
9

IntPrinterまたは、暗黙の取得に実際に使用できる場合:

scala> case class IntPrinter(implicit val i: Int) { def print() = println(i) }
defined class IntPrinter

scala> val p = IntPrinter()(9)
p: IntPrinter = IntPrinter(9)

scala> p.print()
9

基本的に、その場合、暗黙的であることを2回指定する必要はありません。初めて暗黙的に宣言したとき、それiはクラスのメンバーになったので、クラスの他のデータメンバーと同じように、クラスの残りの部分全体でそれを参照し続けることができます。

于 2012-04-15T18:36:49.230 に答える
1

確かにそれは正しい行動です。implicit値は現在のスコープでのみ検索され、print外部で呼び出すIntPrinterことは、(明らかに) クラス スコープ上にないことを意味し、そうしなければならなかった理由importです。

私が望んでいたことを行う正しい方法:

case class IntPrinter(implicit val i: Int) {
  def print()(implicit i: Int) = println(i)
  def printProxy() = print()
}

そして、呼び出しp.printProxyは、私が望んでいたように動作します(のスコープprintProxy内にあるため)。IntPrinter

于 2012-04-15T18:44:55.847 に答える