2012-02-27 10 views
5

たとえば、消去クラスを取得するには、関数def a[A:ClassManifest]のマニフェストにアクセスする必要があります。私はPredef.implicitly関数を使用することができますが、その場合、私のコードはフルフォームdef a[A](implicit b:ClassManifest[A])を使用している限り長くなります。 暗黙的な引数に便利な生成名がありますか?暗黙的な「暗黙的」すなわちdef a [A:B]またはdef A [%B]へのアクセス方法を教えてください。

+1

名前の小さいメソッドを宣言することはできますが、Scalacによって生成される魔法の名前に依存する必要はありません。 –

答えて

5

Manifest秒、ClassManifest sおよびOptManifest秒のためにそれを行うだろうPredefにおける3つの定義済みの方法があります。それぞれ、manifest[T]classManifest[T]optManifest[T]が。同じパターンに従って、他の型クラスのための独自の "暗黙のゲッター"を書くことができます。ここでは、インスタンスmanifest[T]ためのものです。だからここ

def manifest[T](implicit m: Manifest[T]) = m 

は、あなた自身を書くことができ方法は次のとおりです。

trait UsefulTypeclass[A] { 
    def info = 42 // sample method 
} 

// the “implicit getter” 
def usefulTypeclass[A](implicit tc: UsefulTypeclass[A]) = tc 

// a method that uses the implicit getter 
def foo[A: UsefulTypeclass] = 
    usefulTypeclass[A].info 
+2

暗黙のトリック:暗黙のゲッターに "apply"という名前を付けてUsefulTypeclassのコンパニオンオブジェクトに置くと、Tのtypeclassのインスタンスを表す値として "UsefulTypeclass [T]"を使用できます。 typeclassそのもの。 –

+0

@RM素敵なトリックです。私は 'UsefulTypeclass [T]()'(余分な '()')でなければならないと思います。 –

+0

実際には、括弧は必要ありません。 "apply"が定義されているので(TC {SomeClass})、TC(def apply [T](暗黙のx:TC [T])= x}というオブジェクトTCを呼び出すことができます暗黙的なパラメータリストを持つパラメータのないメソッドとして、[SomeClass]はTCオブジェクトへの参照から曖昧さを解消します。それは、TC.apply [SomeClass](theImplicitValue) –

0

scalap救助に!

私はこのコードを取った:

object TestThing extends App { 
    def one { println("one") } 
    def two[T] { println("two") } 
    def three[T : Manifest] { println("three") } 
    def four[T: Manifest, U : Manifest] { println("four") } 
} 

をしてscalapを通してそれを実行しました。

object TestThing extends java.lang.Object with scala.App with scala.ScalaObject { 
    def this() = { /* compiled code */ } 
    def one : scala.Unit = { /* compiled code */ } 
    def two[T] : scala.Unit = { /* compiled code */ } 
    def three[T](implicit evidence$1 : scala.Predef.Manifest[T]) : scala.Unit = { /* compiled code */ } 
    def four[T, U](implicit evidence$2 : scala.Predef.Manifest[T], evidence$3 : scala.Predef.Manifest[U]) : scala.Unit = { /* compiled code */ } 
} 

あなたが見ることができるように、最初の暗黙のマニフェストがevidence$1と呼ばれている:ここで私が得たものです。第二と第三 - しかし別の範囲で! - evidence$2evidence$3となります。だから...マニフェストを参照する方法です。

それにもかかわらず、クラス内で上位のマニフェストを削除すると、ファイル内の下位にあるマニフェストの名前が変更されることは私にとっては恐ろしいことです。同様に、IntelliJ Scalaプラグインの構文強調表示では、four()の範囲のマニフェスト変数がevidence$1evidence$2であり、evidence$3が有効な変数であるとは考えられません。 evidence$1ではありません)。全体として、暗黙のマニフェスト変数を使って遊ぶことについての警告兆候としてこれらのことに耳を傾けるべきでしょうか?

+2

これらの名前は、内部実装の詳細であり、信頼されていないはずです。 – Ben

+0

@Benそこから私の反対はありません.... – Destin

+1

そのため、あなたは 'implicitly'を使っています...あなたのコードに' evidence $ 1'などを使ってみるとコンパイルできません。 –

関連する問題