Scala重载方法有什么问题

Raj*_*eev 4 scala

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

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

  joiner(List("sdsdfsd", "sdsd"))
Run Code Online (Sandbox Code Playgroud)

错误:

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.", ""))
                                                                                                                      ^
Run Code Online (Sandbox Code Playgroud)

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

Arc*_*heg 6

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

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

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

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

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

  • 一个狡辩:即使在REPL中,这些肯定是JVM意义上的方法,而不是函数,它们是实现`scala.FunctionN`的对象.这个问题与REPL如何评估定义有关,这有点复杂.如果你使用`:paste`,你可以在REPL中完全按照这些方法定义这些方法,这也是值得的. (3认同)