1

Typeインスタンスを通常の Scala 型として使用することは可能ですか? たとえば、次のスニペットでは、tpeを使用してpiを見つけることができますか?

import scala.reflect.runtime.universe._

implicit val pi: Double = 3.14159265
val tpe = typeOf[Double]
implicitly[Double] // pi
implicitly[tpe]???

私の目標を達成するための簡単な解決策がないこと、およびtpe暗黙的に [Double]に変換するための一種のファクトリが必要になることを恐れています。とにかく、リフレクション型を Scala コードに統合することは非常に強力であり、見た目ほどクレイジーではないと思います。

4

1 に答える 1

1

これがどのように理にかなっているのかわかりません。

それが何を意味するのかについて話しましょうimplicitly。そのような暗黙的、または複数の適格性がない場合、コンパイルに失敗するはずです。しかし、 によって表される実際の型tpeは実行時までわからないためimplicitly、型インスタンスを操作すると、あらゆる種類のコンパイル エラーを発生させることができなくなります。あなたができる最善の方法はimplicitly、常にコンパイルするように呼び出しを調整し、コンパイラにスコープ内のすべての暗黙的な値のリストをどこかに保存させ (任意の型)、実行時にこのリストを検索し、一致するものがない場合は例外をスローすることです。によって表されるタイプtpe(または複数ある場合)。implicitlyこれは、たとえばの代替実装について話している場合にのみ、何らかの意味を持ちますdynamicImplicitly

これには、コンパイラからの明示的なサポートが必要になることに注意してください ( への呼び出しごとにスコープ内のすべての暗黙関数をキャプチャするdynamicImplicitlyため、単なる単純な関数にはなりません)。ある時点でのスコープ? はい、たくさんありますdynamicImplicitly.

つまり、私の短い答えは次のとおりです。この機能がすぐに実装されるのを待ってはいけません。技術的には、scala マクロとして実装することは可能かもしれませんdynamicImplicitly(ただし、scala マクロからスコープ内のすべての暗黙的要素を取得できることを条件としていますが、これはよくわかりません)。

于 2012-10-04T16:25:58.450 に答える