scala - 重载具有按名称调用参数的函数和具有按值参数的函数

标签 scala overloading callbyname

为什么 doSmth(() => s) 不能编译? 为什么其余代码输出“值”?有没有办法调用第二个函数(使用按名称调用参数)?

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 无法知道您指的是哪一个。而在上面,该方法的第二个版本采用从单元到字符串的函数。

关于scala - 重载具有按名称调用参数的函数和具有按值参数的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32327395/

相关文章:

c++ - 右值和左值的重载函数

theory - 按名称调用电话的示例

xml - Scala 解析器组合器解析 xml?

scala - isInstance和isInstanceOf之间的区别

java - 拳击+Varargs 优于拳击+加宽

c++ - 为具有指针成员的类正确重载赋值运算符

c++ - 按名称调用/按值调用

c# - C# 是否支持按结果调用?

scala - 如果我不能使用 SparkContext,如何创建 DataFrame?

scala - 了解柯里化(Currying) Scala