4

scala 2.10 REPFL では:

>
class E(val i: Int) { def += (other: E) = i - other.i }
implicit def toE(i: Int) = new E(i)
var j = 1
j += 3

結果:

res1: Int = -2
> j
j: Int = 1

+=以前の変換方法を使用する場合と比較して、クラス E 自体が暗黙的としてマークされている場合、通常との干渉がないことに注意してください。

うわー、この暗黙の変換がスコープ内にある場合、プログラムを完全に混乱させることができました! 意味が既に存在する場合、暗黙に変換しないようにscalaに依頼する方法はありますか?

4

2 に答える 2

3

もう1つの回答は、明示的な仕様からの一節全体を引用していませんでした:

再解釈は、次の 2 つの条件が満たされる場合に発生します。1. 左側の l には += という名前のメンバーがなく、暗黙的な変換 (§6.26) によって += という名前のメンバーを持つ値に変換することもできません。

(もう 1 つの条件は、型チェックを行うことです。)

toEクラスも暗黙的にすると、あいまいで黙って無視される 2 つの暗黙的な変換 (そのうちの 1 つはあなたの ) が定義されます。(これはある種の特徴です。)

これで、あなたは自分自身の質問に答えました。暗黙をオフにする 1 つの方法は、あいまいにすることです。

もう 1 つの方法は、名前をシャドウすることです。暗黙的なものは単純な名前で使用できる必要があるためです。

大混乱をもたらすことについて:今、あなたはなぜあなたがしなければならないのかを知っていますimport scala.language.implicitConversions.

また、REPFL [sic] の F--- が何を表しているかもわかっていると思います。

于 2013-08-09T16:30:08.503 に答える
3

この動作を変更できるかどうかはお答えできませんが、仕様 (p. 85) で次の説明を見つけました。

代入演算子は、他の解釈が有効でない場合に代入に展開できるという点で特別に扱われます。中置演算 l += r の += などの代入演算子を考えてみましょう。ここで、l、r は式です。この操作は、割り当て l = l + r に対応する操作として再解釈できます。

このことから、あなたが別の解釈を提供したため、拡張が行われないことがわかりました。Myabe 問題を追跡するのに役立ちます。

于 2013-08-09T16:16:57.143 に答える