Scala重载方法有什么问题

时间:2016-01-22 16:34:24

标签: scala

下面的代码会在工作表中引发编译错误

 def joiner(strings:List[String], separator:String):String = strings.mkString(separator)
  def joiner(strings:List[String]):String = joiner(strings, "  ")

  joiner(List("sdsdfsd", "sdsd"))

错误:

Error:(12, 120) too many arguments for method joiner: (strings: List[String])String
println("joiner: " + MacroPrinter211.printGeneric({import inst$A$A._ ;def joiner(strings:List[String]):String = joiner(strings, "  ") }).replace("inst$A$A.", ""))
                                                                                                                      ^

我有重载的木匠方法。为什么它会给错误提供太多的论据?

2 个答案:

答案 0 :(得分:6)

如果将代码放在类或对象中,则代码可以正常工作,因为类或对象可以在scala中具有重载方法。

但是如果你在REPL中编写代码 - 这些不是方法,而是函数。功能不能超载。所以你应该将它们放在一个对象或类中,或者使用@StuartMcvean

建议的默认参数

更新由于@Travis正确地纠正了我的回答,我在这里发生的事情的原因是错误的。看起来像REPL(和工作表)也没有正确处理它,因为它处理方法的机制。

据我所知(我希望这次我更正),这是因为REPL需要将一个方法更改为另一个方法,因为REPL允许您定义具有不兼容签名的方法,替换旧方法(例如,只有返回值不同的方法)

如果您尝试使用:paste粘贴代码(不确定工作表的等效内容) - 它会正确处理

答案 1 :(得分:3)

在scala中,您可以提供默认参数。这将允许您执行以下操作:

def joiner(strings:List[String], separator:String = " "): String =
  strings.mkString(separator)

joiner(List("sdsdfsd", "sdsd"))