Scala函数和按名称呼叫的问题

时间:2020-05-29 00:14:41

标签: scala callbyname

我正在尝试在此函数中循环使用使用按名称调用参数的第二个参数(exp)。前三个参数是索引,布尔值(用于停止循环)和增量函数。当我尝试循环10次“ hello world”时,得到10'()的输出,如测试代码所示。在这里有什么问题我可以寻求帮助吗?谢谢

def forLoop(ival: => Int, f: (Int) => Boolean, g: (Int)=>Int)(exp: => Unit): Unit = {
  if(f(ival)==false) 
    return
  else {
    println(exp)
    forLoop(g(ival),f,g)(exp)
  }
}

def f(x: Int): Boolean = { x<10 }
def g(y: Int): Int = { y+1 }
val exp: Unit = "Hello World"
forLoop(0,f,g)("Hello World")

2 个答案:

答案 0 :(得分:2)

"Hello World"的类型为String,但是您将其分配给Unit

val exp: Unit = "Hello World"

哪个编译器可以扩展到

val exp: Unit = {
  "Hello World";
  ()
}

请注意()如何成为exp的值。尝试将exp的定义更改为

val exp: String = "Hello World"

第二个参数列表到

(exp: => String)

例如,如果使用编译器标志-Wvalue-discard进行编译,

scala -Wvalue-discard -e 'val exp: Unit = "Hello World"'

您会收到警告

warning: discarded non-Unit value
val exp: Unit = "Hello World"
                ^

答案 1 :(得分:2)

我认为这符合您的要求。

def forLoop(ival: => Int, f: =>Int => Boolean, g: =>Int=>Int
           )(exp: => Unit): Unit =
  if (f(ival)) {
    exp
    forLoop(g(ival),f,g)(exp)
  }

def f(x: Int): Boolean = x<10
def g(y: Int): Int = y+1
def exp: Unit = println("Hello World")
forLoop(0,f,g)(exp)