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】:

“控制抽象”是例如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 调用非常相似。当然,当你编写的函数与现有的控制结构比较不同时,这会更有用。

【讨论】:

【参考方案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方法调用中的花括号[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Scala方法调用中括号的规则是啥?

2021年大数据常用语言Scala:基础语法学习 方法调用方式

Scala中调用函数或者方法为啥有时候需要括号,有时候不需要括号

scala初学

每个[重复]的es6箭头函数中的花括号

Scala学习——高级特性