"(=> A-Certain-Type)"的含义是什么?在斯卡拉?

时间:2016-10-31 07:31:40

标签: scala

这是一段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)的含义是什么?

1 个答案:

答案 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