2016-07-03 5 views
3

これは非常に簡単な答えですが、どうやって演算子をオーバーロードしますか?Scalaでの動作のオーバーロードREPL

明白な解決策は、それが可能だけれども、私が間違って何が起こっているのか誤解だ、失敗しているように見える:

scala> def +(s:Int): Int = {print (s); this + s} 
$plus: (s: Int)Int 

scala> 1 + 2 
res20: Int = 3 

は、当然のことながら、私は2res20: Int = 3のようなものを期待していました。私は間違って何をしていますか?

+0

私はあなたがintが持っているのオーバーロードではない、ここで上書きしようとしていると思いますすでにこの演算子が定義されています。 – tkachuko

+0

あなたが定義した '+'メソッドは '1 + 2'で呼び出されるメソッドに対応していると思いますか? – Jubobs

答えて

3

Scalaでは、すべての演算子はメソッドです。既存のメソッド(既に+メソッドを定義しているのでInt)をオーバーライドするには、+メソッドを継承してoverrideメソッドを実行し、派生タイプを操作する必要があります。 REPL(率直に言って、私はこの方法は、REPLでthisを使用してコンパイルし、非常に驚​​いている)でdef +メソッドを定義する際のオーバーロードについては

、あなたは本当にIntをオーバーロードされていません。あなたがしているのは、単一の引数を取る+メソッドを作成することだけです。 Intの新しいオーバーロードを作成するために、あなたはimplicit class経由pimp my library pattern、またはスカラ座> = 2.10でを使用する必要があります:

scala> implicit class PimpedInt(x: Int) { 
    | def +(i: Int, s: String): Int = { 
    |  println(s) 
    |  x + i 
    | } 
    | } 
defined class PimpedInt 

scala> 1 + (1, "hello") 
hello 
res8: Int = 2 
+0

'PimpedInt'は' AnyVal'を拡張してみませんか? – Jubobs

+1

@Jubobs確かに可能ですが、この例では重要ではありませんでした。 –

+0

合意。私は 'def +(s:Int):Int = {print(s); this + s} 'はREPLでまったくコンパイルされません。この場合、「これ」とは何を指していますか? – Jubobs

関連する問題