这是一段scala代码:
var hof: (=> Int) => Int = {r=>r+1}
有人可以向我解释(=> Int)
的含义是什么吗?之前,我认为它与(() => Int) => Int
相同,但事实并非如此。我测试了它如下:
scala> var hof: (=> Int) => Int = {r=>r+1}
hof: (=> Int) => Int = <function1>
scala> hof({()=>1})
<console>:13: error: type mismatch;
found : () => Int
required: Int
hof({()=>1})
如果我将其更改为hof(1)
,您可以看到它的错误,如果有效的话。谁能告诉我(=>A-Certain-Type)
的含义是什么?
答案 0 :(得分:0)
您可以将此( => Int)
称为代码块,仅在按名称调用时才会计算为Int。
code: => T
是按名称参数调用
def repeat[T](code: => T)(times: Int): List[T] = {
(1 to times).toList.map {_ => code }
}
考虑上面的代码片段。上述函数中的code
可以接受任何将计算为T的表达式或表达式组。只有在按名称调用代码块时才会对其进行求值。
Scala REPL
scala> repeat { println("hello") }(3)
hello
hello
hello
res2: List[Unit] = List((), (), ())
scala> repeat { println("hello"); 1 }(3)
hello
hello
hello
res3: List[Int] = List(1, 1, 1)
scala> repeat(println("foo"))(1)
foo
res4: List[Unit] = List(())
按名称调用可让您构建有趣的内容,例如循环
def loop(cond: => Boolean)(codeBlock: => Unit): Unit = {
if (cond) {
codeBlock
loop(cond)(codeBlock)
} else ()
}
魔术的发生是因为每次通过名称
调用代码块时都会对其进行惰性评估Scala REPL
scala> def loop(cond: => Boolean)(codeBlock: => Unit): Unit = {
| if (cond) {
| codeBlock
| loop(cond)(codeBlock)
| } else ()
| }
loop: (cond: => Boolean)(codeBlock: => Unit)Unit
scala> var i = 0
i: Int = 0
scala> loop(i < 10) { println("foobar"); i += 1}
foobar
foobar
foobar
foobar
foobar
foobar
foobar
foobar
foobar
foobar