需要帮助了解语法

时间:2018-11-17 07:14:03

标签: scala

我是Scala初学者。我知道函数声明的语法

def function_name(parameter:return_type):return_type = {function_body} 

引用此链接https://livebook.manning.com/#!/book/scala-in-action/chapter-2/161。 我无法摆脱那里写的代码

def breakable(op: => Unit) { ... }

有人可以解释吗?

2 个答案:

答案 0 :(得分:3)

这是用于声明返回Unit的函数的简写语法(在类似void的语言中,该函数与C大致相同)。

定义

def breakable(op: => Unit) { ... }

相同
def breakable(op: => Unit): Unit = { ... }

在更高版本的Scala中可能会删除此语法,因此即使声明返回=的函数,最好也包含Unit


该参数被声明为op: => Unit,这意味着它是一个 call-by-name 参数。这意味着传递给此参数的表达式仅在使用时才求值,并且每次使用时都会求值。在这种情况下,这意味着您可以方便地将代码块传递给breakable

breakable {
    println("I have been called")
}

每次breakable评估op时,将执行println语句。

答案 1 :(得分:1)

在scala中,函数可以将值(预先计算的值或尚未计算的值)与函数一起作为参数。

因此,以计算值作为参数的函数

scala> def f(a: Int) = a * 100
f: (a: Int)Int

函数示例,该函数的代码块返回Int(尚未计算),此处的代码块可能只是匿名方法,也可能是现有方法(不是函数;这就是事情的所在)变得凌乱)

scala> def f(a: => Int) = a
f: (a: => Int)Int

并使用它,

scala> def a: Int = 100 * 100
a: Int

scala> f(a) //a returns Int so confirms a: => Int
res3: Int = 10000

在您的示例中,def breakable(op: => Unit) { ... }接受一个参数,WILLL将被计算为Unit

例如,您可以传递println,返回Unit

scala> def breakable(op: => Unit) = op
breakable: (op: => Unit)Unit

scala> breakable { println("i m learning fp") }
i m learning fp

您将看到的另一件事是函数将函数作为参数,例如Functor,Monad等。

例如,map上的flatMap / List[Int]将是

final override def map[B](f: A => B): List[B]
final override def flatMap[B](f: Int => scala.collection.IterableOnce[B]): List[B]