2016-06-26 7 views
3

私はScalaのProgramming in M. Oderskyを読んでいますが、今は演算子の意味を理解しようとしています。私が見る限り、Scalaの演算子は単なる方法です。次の例を考えてみましょう。+ = Scalaの演算子

class OperatorTest(var a : Int) { 

    def +(ot: OperatorTest): OperatorTest = { 
    val retVal = OperatorTest(0); 
    retVal.a = a + ot.a; 
    println("=") 
    return retVal; 
    } 
} 

object OperatorTest { 
    def apply(a: Int) = new OperatorTest(a); 
} 

私はこのクラスで+演算子しか定義していません。私たちはこのような何かを入力した場合と:

var ot = OperatorTest(10); 
var ot2 = OperatorTest(20); 
ot += ot2; 
println(ot.a); 

はその後

=+ 
30 

が出力されます。ですから、Scalaの各クラス(または型?)に対して+=演算子が定義されているとします(a += b iff a = a + b)。しかし、すべての演算子は単なる方法なので、+ =演算子はどこに定義されていますか?多分、そのような演算子のためのすべてのdefenitionsを含んでいるいくつかのクラス(JavaではObjectのような)があります。

私は見つけることを望んでAnyRefを見ましたが、できませんでした。

答えて

7

+=などがあり、+が定義されていて、+=が定義されていない場合は、コンパイラによって同様の演算子が除外されます。 (同様に、あまりにも他の事業者のために働く。)(6.12.4)Scalaの言語仕様を確認します。他の解釈が有効でない場合、彼らは が割り当てに拡張することができるという

代入演算子は特別扱いされています。

入れ子演算の+ =などの代入演算子を考えてみましょう。 l + = rここで、l、rは式です。この操作は 操作の左辺Lは 一度だけ評価されることを除いて割り当て

リットル= L + Rに対応する操作として再解釈することができます。

次の2つの条件が満たされている場合、再解釈が行われます。

左辺lに+ =という名前のメンバーがなく、 + =というメンバーの値に暗黙的に変換することによって を暗黙的に変換することはできません。割り当てl = l + rは型正しくあります。特に、これは、lが、 に割り当てることができ、+という名前のメンバを持つ値に変換可能な変数またはオブジェクトを参照することを意味します。