scala语法糖之括号论

1,774次阅读次阅读
没有评论

初学scala,看着scala入门教程,看的越多,大括号还有小括号需要深入了解一下 如果你要调用的函数有两个或两个以上的参数,那么你只能使用“小括号” 请看下面的示例:

scala> var add = (x: Int,y: Int) => x + y add: (Int, Int) => Int =

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

scala> add{1,2} :1: error: ‘;’ expected but ‘,’ found. add{1,2} ^ 如果你要调用的函数只有单一参数,那么“通常”情况下小括号和花括号是可以互换的 请看下面的示例:

scala> var increase = (x: Int) => x + 1 increase: Int => Int =

scala> increase(10) res0: Int = 11

scala> increase{10} res1: Int = 11 在调用单一参数函数时,小括号和花括号虽然等效,但还是有差异的 如果使用小括号,意味着你告诉编译器:它只接受单一的一行,因此,如果你意外地输入2行或更多,编译器就会报错。但对花括号来说则不然,如果你在花括号里忘记了一个操作符,代码是可以编辑的,但是会得到出乎意料的结果,进而导致难以追踪的Bug. 看如下的例子:

scala> def method(x: Int) = { | x + 1 | } method: (x: Int)Int

scala> method { | 1 + | 2 | 3 | } :14: warning: a pure expression does nothing in statement position; you may be omitting necessary parentheses 1 + ^ res14: Int = 4

scala> method( | 1 + | 2 | 3 :4: error: ‘)’ expected but integer literal found. 3 ^ 花括号的调用虽然有warning,但是可以编译通过,小括号的调用会编译报错,但是花括号版本的返回值4是一个超出预期的结果。注意,16-19行,1+2是一行,它们合在一起才是一个完整的表达式,3是独立的表达式,算第二行。

所以,在调用单一参数函数时,特别是高阶函数, 如果函数参数用一行可以表达,通常我们推荐还是使用小括号,这样我们可以借助编译器获得更好的错误检查。

在调用一个单一参数函数时,如果参数本身是一个通过case语句实现的 “偏函数”(偏函数可以参考),你只能使用“花括号” 究其原因,我觉得scala对小括号和花括号的使用还是有一种“习惯上”的定位的:通常人们还是会认为小括号是面向单行的,花括号面向多行的。在使用case实现偏函数时,通常都会是多个case语句,小括号不能满足这种场合,只是说在只有一个case语句时,会让人产生误解,认为只有一行,为什么不使用case语句。

scala> val tupleList = List[(String, String)]() tupleList: List[(String, String)] = List()

scala> val filtered = tupleList.takeWhile( case (s1, s2) => s1 == s2 ) :1: error: illegal start of simple expression val filtered = tupleList.takeWhile( case (s1, s2) => s1 == s2 ) ^

scala> val filtered = tupleList.takeWhile{ case (s1, s2) => s1 == s2 } filtered: List[(String, String)] = List() 作为表达式(expression)和语句块(code blocks)时 if you need declarations, multiple statements, an import or anything like that, you need curly braces. And because an expression is a statement, parenthesis may appear inside curly braces. But the interesting thing is that blocks of code are also expressions, so you can use them anywhere inside an expression:

在非函数调用时,小括号可以用于界定表达式,花括号可以用于界定代码块。代码块由多条语句(statement)组成,每一条语句可以是一个”import”语句,一个变量或函数的声明,或者是一个表达式(expression),而一个表达式必定也是一条语句(statement),所以小括号可能出现在花括号里面,同时,语句块里可以出现表达式,所以花括号也可能出现在小括号里。看看下面的例子:

1 // literal – 字面量 (1) // expression – 表达式 {1} // block of code – 代码块 ({1}) // expression with a block of code – 表达式里是一个语句块 {(1)} // block of code with an expression – 语句块里是一个表达式 ({(1)}) // you get the drift… – 你懂的。。。。

本文原文出处: http://blog.csdn.net/bluishglc/article/details/52946575

admin
版权声明:本站原创文章,由admin2018-01-04发表,共计2733字。
转载提示:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)