Scala方法调用中的花括号[重复]
Posted
技术标签:
【中文标题】Scala方法调用中的花括号[重复]【英文标题】:Curly braces in Scala method call [duplicate] 【发布时间】:2018-04-07 11:06:20 【问题描述】:在 Scala 中,我们可以:
println "你好,世界!"
来自《Scala 编程》一书:
这种能力的目的是用花括号代替括号 传入一个参数是为了让客户端程序员编写函数 花括号之间的文字。这可以使方法调用感觉更像是 控制抽象。
这句话是什么意思?
【问题讨论】:
也在这里发帖:users.scala-lang.org/t/curly-braces-in-scala-method-call/2588 【参考方案1】:这是语法糖,只是为了外观和感觉。当函数将函数作为参数时,如
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
来完成这项工作? ***.com/q/56866965/14955
@Thilo 在那里回答。【参考方案2】:
“控制抽象”是例如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
调用非常相似。当然,当你编写的函数与现有的控制结构比较不同时,这会更有用。
【讨论】:
【参考方案3】:除了(常规)函数和按名称参数外,大括号还有助于偏函数:
processList(l)
case Nil => ...
case h :: t => ...
和表达式序列:
doSomething
thing1;
thing2
请注意,(thing1; thing2)
在 Scala 中不是一个有效的表达式,就像在 ML 中那样。
【讨论】:
【参考方案4】:实际上我注意到花括号 和括号()之间的区别在于您可以在花括号中写多行。例如,在括号()中,您不能写多于一行。
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.mapy=>
case temp:Int=>println(temp)
case _ => println(“NOT Int”) //it willwork
所以我们可以说它只是一种合成糖,允许开发人员在没有 ; 的情况下编写更多的代码。就是这样,它也可能有其他原因。
【讨论】:
以上是关于Scala方法调用中的花括号[重复]的主要内容,如果未能解决你的问题,请参考以下文章
2021年大数据常用语言Scala:基础语法学习 方法调用方式