【问题标题】:Curly braces in Scala method call [duplicate]Scala方法调用中的花括号[重复]
【发布时间】:2018-04-07 11:06:20
【问题描述】:

在 Scala 中,我们可以:

println { "你好,世界!" }

来自《Scala 编程》一书:

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

这句话是什么意思?

【问题讨论】:

标签: scala


【解决方案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 来完成这项工作? stackoverflow.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.map{y=> 
      case temp:Int=>println(temp)
      case _ => println(“NOT Int”)} //it willwork
      

      所以我们可以说它只是一种合成糖,允许开发人员在没有 ; 的情况下编写更多的代码。就是这样,它也可能有其他原因。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-26
        • 2020-09-28
        相关资源
        最近更新 更多