2012-04-15 11 views
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 

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


EDIT:それは期待どおりに動作実際の問題として私はこのようなp._をインポートする場合:確かに9を印刷し

import p._ 
p.print() 

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

+0

インポートすることを理由 '(printProxyIntPrinterの範囲内にあるので。) p._'は、 'caseクラスのIntPrinter(暗黙のval i:Int)'から 'i'を単にスコープに入れているためです。しかし、...私はすでにクラスの中で "範囲内"です。あなたはそれにアクセスするために特別なことを行う必要はありません。 – Destin

答えて

1

確かに正しい動作です。 implicitの値は現在のスコープ内でのみ検索され、IntPrinterの外にあるprintを呼び出すと、それはクラスのスコープにはないことを意味します(なぜなら)私はimportにしなければなりません。

私が欲しかったものを行うための正しい方法:その後、

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

そして、私はそれが動作するように望んでいたようp.printProxy振る舞いを呼び出す

1

わかりません。なぜあなたはここに黙示を必要としているのですか?あなたが本当に使用している場合は、暗黙的を取るIntPrinterため、

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 

のか:それはあなたが同じように簡単にこれを行うことができると思われる場合には、

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がクラスのメンバーになりました。クラスの他のデータメンバーと同じように、クラスの残りの部分で参照を続けることができます。

+0

これは単なる最小の例ですが、私が使用する意味はもっと複雑です。とにかく私のせいだが、達成しようとしたことを表現するのに失敗した(私の答えを参照)。 – kaoD

+0

@kaoDしかしあなたの答えはまだ本当に意味をなさない。なぜ 'printProxy'に気をつけますか?オブジェクトを作成したときにすでに提供している 'i'にアクセスするだけではどうですか?とにかく 'printProxy'がやっているのはそれだけです。 – Destin

+0

これは私が言ったように、これは私が達成したいと思うものの最小の例です。私は明示的にそれらにアクセスすることなく(暗黙とコードの明快さのために)明示的にアクセスすることなく、暗黙的なパラメータを透過的に扱うべきであるDSLに構文上の砂糖を必要とします。残りの時間は見えないようにする必要があります(私が言ったように、私はDSLの明快さを期待しています)。 – kaoD

関連する問題