scala:暗黙的な選択やその他のコードマジックのトレース
-
10-07-2019 - |
質問
ライブラリの動作を理解しようとすると、暗黙的な変換は混乱を招きます。たとえば、「val foo:Foo = 1」などの式を見て、1をFooに変換するものは何ですか?
式の評価中に実行中のコードパスを出力するようにscalaライブラリ(またはREPL)に指示することはできますか?
解決
「-Xprint:typer」を追加できます;コンパイラーのコマンドライン(またはSwing GUIブラウザーの場合は「-Ybrowse:typer」)に移動して、変換が明示的に適用されたコードを確認します。
他のヒント
変換を出力する代わりに、暗黙のうちに単純に抜け出すことはできないことに気付く必要があります。何らかの方法でそれらをスコープに入れる必要があります。代替手段は次のとおりです。
- 明示的な
import
ステートメント。y
がオブジェクトである場合、暗黙的にスコープに取り込む唯一の方法であるため、import x.y ._
に注意してください。 - 他の何かに変換されるクラスのオブジェクトコンパニオン。
- ターゲットが何らかの形で明示されている限り(例のように)、ターゲットクラスのオブジェクトコンパニオン。
オブジェクト scala.Predef
はデフォルトですべてスコープにインポートされることに注意してください。これにより、Scalaのデフォルトの暗黙的な暗黙のスコープが取得されます。
scalac -print
は、適用される暗黙的な型変換後にコードを出力します。
class A{
val x : String = "hi" drop 1
}
結果は次のとおりです:
package <empty> {
class A extends java.lang.Object with ScalaObject {
@remote def $tag(): Int = scala.ScalaObject$class.$tag(A.this);
private[this] val x: java.lang.String = _;
<stable> <accessor> def x(): java.lang.String = A.this.x;
def this(): A = {
A.super.this();
A.this.x = scala.this.Predef.forceRandomAccessCharSeq(
scala.this.Predef.stringWrapper("hi").drop(1));
()
}
}
}
所属していません StackOverflow