我是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) { ... }
有人可以解释吗?
答案 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]