4

ライブラリがどのように機能するかを理解しようとすると、暗黙的な変換が混乱を招きます。たとえば、「val foo: Foo = 1」のような式を見ると、何が 1 を Foo に変換するのでしょうか?

式の評価中に実行中のコード パスを出力するように scala ライブラリ (または REPL) に指示することは可能ですか?

4

3 に答える 3

7

コンパイラ コマンド ラインに「-Xprint:typer」(Swing GUI ブラウザの場合は「-Ybrowse:typer」) を追加すると、変換が明示的に適用されたコードを表示できます。

于 2009-11-30T07:53:32.073 に答える
3

変換を出力する代わりに、暗示が突然出てくるわけではないことを認識しなければなりません。何らかの方法でそれらをスコープに入れる必要があります。代替手段は次のとおりです。

  1. 明示的なimportステートメント。がオブジェクトであるimport x.y._場合に注意してください。これは、暗黙的をスコープに持ち込む唯一の方法です。y
  2. 別のものに変換されるクラスのオブジェクト コンパニオン。
  3. そのターゲットが何らかの形で明示されている限り(あなたの例のように)、ターゲットクラスのオブジェクトコンパニオン。

デフォルトでは、オブジェクトscala.Predefはすべてスコープにインポートされることに注意してください。これは、Scala のデフォルトの暗黙的オブジェクトがスコープに入る方法です。

于 2009-11-30T14:55:53.820 に答える
0

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));
      ()
    }
  }
}
于 2009-11-30T15:56:17.333 に答える