在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 = {}
答案 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
})