我正在尝试在此函数中循环使用使用按名称调用参数的第二个参数(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")
答案 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)