Scala方法调用中的大括号

时间:2018-04-07 11:06:21

标签: scala

在Scala中,我们可以:

  

println {"你好,世界!" }

从Scala编程'

编写
  

此功能的目的是用花括号代替花括号   传递一个参数是为了使客户端程序员能够编写函数   花括号之间的文字。这可以使方法调用感觉更像一个   控制抽象。

这句话是什么意思?

4 个答案:

答案 0 :(得分:4)

这只是外观和感觉的语法糖。当函数将函数作为参数时,如

def doWith[A, B](todo: A => B): B = ???

您通常必须将其称为

doWith( input => ... )
// or even
doWith({ input => ... })

在scala中,允许用curlies替换括号,所以

doWith { input =>
  ...
}

具有像

这样的控制结构的外观和感觉
if (...) {
  ...
}
Imho,这使得调用更高阶函数(如'map'或'collect')更具可读性:

someCollection.map { elem =>
  ...
  ...
}

基本相同
someCollection.map({ elem =>
  ...
  ...
})

少了字符。

答案 1 :(得分:3)

“控制抽象”例如是ifwhile等。所以你可以写一个函数

def myIf[A](cond: Boolean)(ifTrue: => A)(ifFalse: => A): A = 
    if (cond) ifTrue else ifFalse

(如果您不熟悉: => Type语法,请搜索“按名称参数”),您可以将其称为

val absX = myIf(x < 0) { -x } { x }

它看起来与普通if调用非常相似。当然,当您编写的函数与现有控件结构更加不同时,这会更有用。

答案 2 :(得分:0)

除了(常规)函数和按名称参数外,大括号还有助于部分函数:

processList(l) {
  case Nil => ...
  case h :: t => ...
}

和表达序列:

doSomething {
  thing1;
  thing2
}

请注意,(thing1; thing2)不是Scala中的有效表达式,例如ML。

答案 3 :(得分:0)

实际上我注意到花括号{}和括号()之间的区别在于你可以在花括号中写出多行。在括号()中,例如,你不能写一行以上。

val x :[List[Int]]=List(1,2,3,4,5,6,7,8)
x.map(y=> y*5) //it will work fine
x.map(y=> 
case temp:Int=>println(temp)
case _ => println(“NOT Int”)) //it will not work

x.map{y=> 
case temp:Int=>println(temp)
case _ => println(“NOT Int”)} //it willwork

所以我们可以说它只是合成糖,允许开发人员写出更多,然后没有;这就是它可能还有其他一些原因。