【发布时间】:2018-04-07 11:06:20
【问题描述】:
在 Scala 中,我们可以:
println { "你好,世界!" }
来自《Scala 编程》一书:
这种能力的目的是用花括号代替括号 传入一个参数是为了让客户端程序员编写函数 花括号之间的文字。这可以使方法调用感觉更像是 控制抽象。
这句话是什么意思?
【问题讨论】:
标签: scala
在 Scala 中,我们可以:
println { "你好,世界!" }
来自《Scala 编程》一书:
这种能力的目的是用花括号代替括号 传入一个参数是为了让客户端程序员编写函数 花括号之间的文字。这可以使方法调用感觉更像是 控制抽象。
这句话是什么意思?
【问题讨论】:
标签: scala
这是语法糖,只是为了外观和感觉。当函数将函数作为参数时,如
def doWith[A, B](todo: A => B): B = ???
你通常必须这样称呼它
doWith( input => ... )
// or even
doWith({ input => ... })
在scala中允许用花括号替换括号,所以
doWith { input =>
...
}
具有类似控制结构的外观和感觉
if (...) {
...
}
恕我直言,这使得调用“map”或“collect”等高阶函数更具可读性:
someCollection.map { elem =>
...
...
}
本质上是一样的
someCollection.map({ elem =>
...
...
})
字符更少。
【讨论】:
{ 和} 之间,但不是( 和)。
val 而不是def 来完成这项工作? stackoverflow.com/q/56866965/14955
“控制抽象”是例如if、while等。所以你可以写一个函数
def myIf[A](cond: Boolean)(ifTrue: => A)(ifFalse: => A): A =
if (cond) ifTrue else ifFalse
(如果您不熟悉: => Type语法,请搜索“按名称参数”)您可以将其称为
val absX = myIf(x < 0) { -x } { x }
它看起来与普通的if 调用非常相似。当然,当你编写的函数与现有的控制结构比较不同时,这会更有用。
【讨论】:
除了(常规)函数和按名称参数外,大括号还有助于偏函数:
processList(l) {
case Nil => ...
case h :: t => ...
}
和表达式序列:
doSomething {
thing1;
thing2
}
请注意,(thing1; thing2) 在 Scala 中不是一个有效的表达式,就像在 ML 中那样。
【讨论】:
实际上我注意到花括号{} 和括号()之间的区别在于您可以在花括号中写多行。例如,在括号()中,您不能写多于一行。
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
所以我们可以说它只是一种合成糖,允许开发人员在没有 ; 的情况下编写更多的代码。就是这样,它也可能有其他原因。
【讨论】: