2016-04-29 34 views
1

下面的代碼失敗在REPL編譯和工作表:重載方法編譯失敗

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

,出現以下錯誤:

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 

但此代碼編譯就好:

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