Scala函数调用省略点号和括号
省略括号
如果一个方法不用接受参数,你可以无需括号就定义它。调用者也必须不加括号地调用它。如果你加上了空括号,那么调用者可以有选择地加或者不加括号。例如,List 的size 方法没有括号,所以你必须写List(1,2,3).size。如果你尝试写List(1,2,3).size() 就会得到一个错误。如下代码,
println(List(1, 2, 3).size)println(List(1, 2, 3).size())
运行并输出,
C:\WorkSpace6-scala\scala-train\src\com\usoft\traversing_mapping_so_on.scala:154: error: Int does not take parameters
println(List(1, 2, 3).size())
^
one error found
然而,String 类的length方法在定义时带有括号,所以,"hello".length() 和"hello".length 都可以通过编译。
Scala 社区的约定是,在没有副作用的前提下,省略调用方法时候的空括号。所以,查询一个序列的大小(size)的时候可以不用括号,但是定义一个方法来转换序列的元素则应该写上括号。
省略点号
如下示例,size 方法是List中得到 List 大小的函数,调用时 可以省略点号
scala> List(1,2,3) sizewarning: there was one feature warning; re-run with -feature for detailsres4: Int = 3
在scala的脚本文件中这样写,
println("hello world" substring(0, 3))
运行并输出,
C:\WorkSpace6-scala\scala-train\src\com\usoft>scala traversing_mapping_so_on.scala
hel
甚至这样写都可以,
println("hello world" substring(0, 3) toUpperCase() indexOf "h")
函数调用使用 {} 代替 ()
当函数 只接收一个参数时,就可以使用花括号 代替 圆括号。如下,
// 定义一个柯里化的函数def sum(i: Int)(j: (Int) => Int) = j(i)val res99 = sum(1) { i => i + 10 }println(res99) // 11def p(x: Int): Unit = { println(x)}p { 2}
运行并输出,
C:\WorkSpace6-scala\scala-train\src\com\usoft>scala traversing_mapping_so_on.scala
11
2
===========END===========