为什么doSmth(() => s)无法编译?
为什么其余代码输出“值”?有没有办法调用第二个函数(带有call-by-name参数)?

object Test {
  def main (args: Array[String]){
    lazy val s: String = ""
    doSmth(s)
    doSmth("")
    doSmth(() => s)
  }

  def doSmth(p: String): Unit = {
    println("value!")
  }
  def doSmth(p: => String): Unit = {
    println("call by name!")
  }
}

最佳答案

以下代码可以正常工作并编译:

def doSmth(p: String): Unit = {
  println("value!")
}
def doSmth(p: () => String): Unit = {
  println("call by name!")
}

lazy val s: String = ""
doSmth(s)
doSmth("")
doSmth(() => s)

请注意,如果您有该方法的两种版本,一种是按名称命名,另一种是按值划分,那么Scala无法知道您所指的是哪一种。代替上面的方法,该方法的第二个版本将函数从单位转换为字符串。

08-19 20:18