3

次の例のように、Scala は可能な最大の式に暗黙のクラス変換を適用しているようです。

scala> class B { def b = { println("bb"); true } }
defined class B

scala> class A { def a = { println("aa"); new B } }
defined class A

scala> (new A).a.b
aa
bb
res16: Boolean = true

scala> class XXX(b: => Boolean) { def xxx = 42 }
defined class XXX

scala> implicit def toXXX(b: => Boolean) = new XXX(b)
toXXX: (b: => Boolean)XXX

scala> (new A).a.b.xxx
res18: Int = 42

私はこの事実に非常に満足していますが、私の質問は、SLS のどの部分でこの動作が指定されているかということです。たとえば、最初に評価されず、その値に変換を適用するだけなのは(new A).a.bなぜですか?true

4

2 に答える 2

0

暗黙の変換を含む行

(new A).a.b.xxx

コンパイラによって (つまり、コンパイル時に) に変換されます。

toXXX((new A).a.b).xxx

-Xprint:typerこれは、 Scala の起動時にオプションを使用するとわかります。

private[this] val res3: Int = $line5.$read.$iw.$iw.toXXX(new $line2.$read.$iw.$iw.A().a.b).xxx;

この変換は実行時ではなくコンパイル時に行われるため、Scala が変換を適用する前に評価(new A).a.bすることは不可能です。したがって、得られる動作は、最初trueに記述した場合とまったく同じです。toXXX((new A).a.b).xxx

于 2012-05-23T21:14:21.373 に答える
0

Ryan Hendrickson がメーリング リストで回答したとおり:

あなたが探している [定義] は、ビューが適用される 3 つの状況のリストのセクション 7.3 にあります。

  1. タイプ T の e を持つ選択 em で、セレクターが T のメンバーを示さない場合。この場合、e に適用可能なビュー v が検索され、その結果には m という名前のメンバーが含まれます。検索は、暗黙のパラメーターの場合と同様に行われます。ここで、暗黙のスコープは T のものです。そのようなビューが見つかった場合、選択 em は v(e).m に変換されます。

そのため、コンパイラは v(e).m と意味的に同等のもののみを生成できます。

val x = e
v(x).m

は意味的に と同等ではありませんv(e).m

于 2012-05-29T16:35:57.713 に答える