scala()vs {}参数调用的定义

时间:2017-03-21 23:43:45

标签: scala scalatest

在Coursera课程“Scala中的函数式编程原理”第1周样本作业(https://www.coursera.org/learn/progfun1/programming/xIz9O/example-assignment)中,Martin Ordersky在他的一篇评论(ListsSuites.scala测试的第44行)中提及

   * In Scala, it is allowed to pass an argument to a method using the block
   * syntax, i.e. `{ argument }` instead of parentheses `(argument)`.

因此,在Scala中分配函数定义时,它等同于:

def foo = ()

def foo = {}

4 个答案:

答案 0 :(得分:3)

定义方法/ def - 评论在调用def

时指的是
scala> def foo(arg1: Int) = arg1 + 1
foo: foo[](val arg1: Int) => Int

scala> foo(1) // round parenthesis
res0: Int = 2

scala> foo{1} // bracket parenthesis
res1: Int = 2

另请注意,def的主体不需要括在括号中。因此,使用您的示例,以下所有内容都是等效的:

def foo = (???) // ??? means implementation not yet defined
def foo = {???}
def foo = ???

答案 1 :(得分:2)

{}({})是指代码块。

{
  statement1
  statement2
  statement3
}

将返回最后一个语句。

scala> val x = { 
     |  val x = 4 
     |  x + 1
     | }
x: Int = 5

虽然()用于一行表达式。

{}和()何时可互换

1.使用一个参数

调用方法
scala> def printlnme(x: String) = { println(x)}
printlnme: (x: String)Unit

scala> printlnme("using parenthesis")
using parenthesis

scala> printlnme{"using braces"}
using braces

没有使用多个参数的方法,

scala> def add(x: Int, y: Int) = { x + y }
add: (x: Int, y: Int)Int

//can also be (x + y) because one line expression
//scala> def add(x: Int, y: Int) = ( x + y )
//add: (x: Int, y: Int)Int

scala> add(1, 2)
res3: Int = 3

scala> add{1, 2}
<console>:1: error: ';' expected but ',' found.
foo{1, 2}
     ^

2.一行表达

在此示例中,我只打印输入。

scala> List(1, 2, 3).foreach { x => println(x) }
1
2
3

scala> List(1, 2, 3).foreach ( x => println(x) )
1
2
3

或者,说一行map功能。

scala> List(1, 2, 3) map { _ * 3}
res11: List[Int] = List(3, 6, 9)

scala> List(1, 2, 3) map ( _ * 3 )
res12: List[Int] = List(3, 6, 9)

但仅()不能与多行语句一起使用

scala> :paste

List(1, 2, 3) foreach ( x =>
     val y = x * 28
     println(y)
)

<console>:2: error: illegal start of simple expression
     val y = x * 28
     ^

您仍然需要({})才能使用括号作为多行。

scala> :paste

List(1, 2, 3) foreach ( x => {
     val y = x * 28
     println(y)
})

28
56
84

答案 2 :(得分:1)

特别是在你的情况下:是的,它们都会产生foo: Unit

在很多情况下,由于对表达式的评价,它们会产生同样的效果,但严格来说它们是不同的。 {}是一个空块,其值为Unit,因为它的(不存在)最后一个语句的计算结果为Unit,而()Unit的默认值。 1}}类型。

这个问题出现了long ago,关于你的特定问题的关键点是你不能将{}语法用于带有多于1个参数的函数(非咖喱)。可以找到其他案例的广泛报道here。通常这两者是不同的;他们经常碰巧做同样的事情。

答案 3 :(得分:1)

为了给你简要的答案,两者都是内存块的表示,但它在块可容纳的数量方面有所不同。

{}适用于多行定义

 Seq(1, 2, 3, 4, 5).map { x =>
      x + 1
      x - 1
    }

()用于单行定义

   Seq(1, 2, 3, 4, 5).map(x =>
      x + 1
      x -1)

上面的代码会给你编译错误,因为它只能容纳单行。 但你也可以使用{} inside() 来容纳多行代码遵循

Seq(1, 2, 3, 4, 5).map(x => {
  x + 1
  x - 1
})