たとえば、消去クラスを取得するには、関数def a[A:ClassManifest]
のマニフェストにアクセスする必要があります。私はPredef.implicitly関数を使用することができますが、その場合、私のコードはフルフォームdef a[A](implicit b:ClassManifest[A])
を使用している限り長くなります。 暗黙的な引数に便利な生成名がありますか?暗黙的な「暗黙的」すなわちdef a [A:B]またはdef A [%B]へのアクセス方法を教えてください。
答えて
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
暗黙のトリック:暗黙のゲッターに "apply"という名前を付けてUsefulTypeclassのコンパニオンオブジェクトに置くと、Tのtypeclassのインスタンスを表す値として "UsefulTypeclass [T]"を使用できます。 typeclassそのもの。 –
@RM素敵なトリックです。私は 'UsefulTypeclass [T]()'(余分な '()')でなければならないと思います。 –
実際には、括弧は必要ありません。 "apply"が定義されているので(TC {SomeClass})、TC(def apply [T](暗黙のx:TC [T])= x}というオブジェクトTCを呼び出すことができます暗黙的なパラメータリストを持つパラメータのないメソッドとして、[SomeClass]はTCオブジェクトへの参照から曖昧さを解消します。それは、TC.apply [SomeClass](theImplicitValue) –
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$2
とevidence$3
となります。だから...マニフェストを参照する方法です。
それにもかかわらず、クラス内で上位のマニフェストを削除すると、ファイル内の下位にあるマニフェストの名前が変更されることは私にとっては恐ろしいことです。同様に、IntelliJ Scalaプラグインの構文強調表示では、four()
の範囲のマニフェスト変数がevidence$1
とevidence$2
であり、evidence$3
が有効な変数であるとは考えられません。 evidence$1
ではありません)。全体として、暗黙のマニフェスト変数を使って遊ぶことについての警告兆候としてこれらのことに耳を傾けるべきでしょうか?
- 1. 暗黙的なdefフィールドを持つ特性を作成するときに暗黙的なdef関数
- 2. `暗黙のdef`を暗黙的に定義していますか?
- 3. IntelliJ - 静的メンバーの暗黙的なアクセスについて警告する方法を教えてください。
- 4. IdentityServer3の暗黙的なフローではなく、暗黙的なjavascript
- 5. DateTimeから暗黙的に暗黙的に暗黙的に暗黙的に暗黙的に暗黙的に暗黙的に暗黙変換に変換することができません
- 6. スカラ:暗黙的に暗黙のクラスに
- 7. 暗黙的に変換するときに暗黙のany2stringaddシンボル
- 8. シーケンス内の暗黙的な変換
- 9. テンプレート関数の暗黙的な変換
- 10. 暗黙的なパラメータ値自体は暗黙的な値ですか?
- 11. 暗黙的な変換と暗黙のクラス
- 12. 暗黙的対明示的なインタフェース
- 13. は、暗黙的に
- 14. 暗黙の変換を禁止する方法を教えてください。
- 15. コールは、暗黙的にコピーコンストラクタ
- 16. 暗黙的なインターフェイスコール関数
- 17. 暗黙的な変換:非参照
- 18. は、暗黙的に
- 19. Springでの暗黙的なautowiring
- 20. 型で再帰的暗黙のdefを実行する方法はありますか?
- 21. 暗黙的と明示的な.NETスレッディング
- 22. 暗黙的に暗黙的に符号なしタイプに変換される
- 23. C++の暗黙的な変換
- 24. LaTeXの式の暗黙的な改行
- 25. Scalaのシンプルな暗黙的な変換
- 26. varcharからVarbinaryへの暗黙的な変換方法は?
- 27. 暗黙的に行う
- 28. 暗黙的なdefのスカラー上位の型が "暗黙の値を見つけることができませんでした"と失敗しました
- 29. は、典型的なクラスと暗黙
- 30. Scalaの一般的な暗黙のヴァル
名前の小さいメソッドを宣言することはできますが、Scalacによって生成される魔法の名前に依存する必要はありません。 –