scala学习笔记(7):函数(1)
函数是Scala的第一公民!
1 基本定义
scala> def max(x: Int, y: Int): Int = { if (x > y) x else y }
跟着是括号里带有冒号分隔的参数列表。 每个函数参数后面必须带前缀冒号的类型标注,因为Scala编译器(还有解释器,但之后我 们将只说编译器)没办法推断函数参数类型。
在max参数列表的括号之后你会看到另一个“: Int”类型标注。这个东西定义了max函数的结果类型:result type(通常可以省略,因为可以推断)。跟在函数结果类型之后的是一个等号和一对包含了函数体的大括号。 如果大括号内只有一段语句,则可以省略
scala> def max2(x: Int, y: Int) = if (x > y) x else y
当去掉方法体前面的等号时,结果类型将注定是 Unit。 不论方法体里面包含什么都不例外,因为 Scala 编译器可以把任何类型转换为 Unit。例如, 如果方法的最后结果是 String,但方法的结果类型被声明为 Unit,那么 String 将被转变 为 Unit 并失去它的值。因此,如果你本想返回一个非 Unit 的值,却忘记了等号时,那么困惑就出现了。所以为 了得到你想要的结果,你需要插入等号:
scala> def h() = { "this String gets returned!" } h: ()java.lang.String scala> h res0: java.lang.String = this String gets returned!
下面是函数的几种写法
package com.persia object FuncReturnType { //写法一,始终带返回值 def add(x:Int,y:Int):Int={ x+y } def returnUnit():Unit={ println("another way to return void") } //写法二,省略非Unit返回值;如果没有写返回值,则根据等号后面的东西进行类型推演 def test(x:Int)={ x } //写法三,省略等号,返回Unit def returnVoid(){ println("return void") } //写法四:省略花括号,如果函数仅包含一条语句,那么连花括号都可以选择不写 def max2(x: Int, y: Int) = if (x > y) x else y def greet() = println("Hello, world!") def main(args:Array[String]):Unit ={ println(add(1,2)) println(test(1)) } }