REPL和工作表中的重载方法无法编译

时间:2016-04-29 13:55:07

标签: scala

以下代码无法在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)
}

发生了什么事?

2 个答案:

答案 0 :(得分:3)

从REPL开始,您运行的每个语句都在内部范围内,因此add(i: Int, j: Int, k: Int)包含3个参数,外部为add(i: Int, j: Int)。这就是你从REPL得到错误的原因。

答案 1 :(得分:2)

如果要重载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