2016-04-29 7 views
1
次のコードは、REPLでコンパイルに失敗し

のコンパイルに失敗し、ワークシート内:オーバーロードメソッドは

Main.scala:63: not enough arguments for method add: (i: Int, j: Int, k: Int)Int. 
Unspecified value parameter k. 
def add(i: Int, j: Int, k: Int): Int = add(add(i, j), k) 
             ^
Compilation Failed 

しかし、このコードのコンパイル:次のエラーで

def add(i: Int, j: Int): Int = i + j 
def add(i: Int, j: Int, k: Int): Int = add(add(i, j), k) 

ちょうど良い:

object Test { 
    def add(i: Int, j: Int): Int = i + j 
    def add(i: Int, j: Int, k: Int): Int = add(add(i, j), k) 
} 

何が起こっているのですか?

答えて

3

REPLから、実行する各ステートメントは内側スコープになります。したがって、add(i: Int, j: Int, k: Int)では3つのパラメータ、シャドウアウターadd(i: Int, j: Int)を使用します。 REPLからエラーが出るのはそのためです。

1

REPLでメソッドをオーバーロードする場合は、:pasteモードで入力するか、オブジェクトにラップします。

scala> :paste 
// Entering paste mode (ctrl-D to finish) 

def add(i: Int, j: Int): Int = i + j 
def add(i: Int, j: Int, k: Int): Int = add(add(i, j), k) 

// Exiting paste mode, now interpreting. 

add: (i: Int, j: Int)Int <and> (i: Int, j: Int, k: Int)Int 
add: (i: Int, j: Int)Int <and> (i: Int, j: Int, k: Int)Int 

scala> object Wrapper { 
    | def add(i: Int, j: Int): Int = i + j 
    | def add(i: Int, j: Int, k: Int): Int = add(add(i, j), k) 
    | } 
defined module Wrapper 
関連する問題