函数
原创大约 2 分钟
定义
Scala 2规定函数所有的参数必须有明确的类型,但返回值的类型不是必须的,因为它可以通过上下文推导出来。
scala> def sayHello(name: String) = println("hello," + name)
sayHello: (name: String)Unit
scala> sayHello("scala")
hello,scala
scala> :paste
// Entering paste mode (ctrl-D to finish)
def sayHello(name: String, age: Int) = {
println("hello, " + name, "age is " + age)
// 最后一行代码就是函数的返回值,不需要`return`
age
}
// Exiting paste mode, now interpreting.
sayHello: (name: String, age: Int)Unit
scala> val age = sayHello("scala", 22)
(hello, scala,age is 22)
age: Int = 22
scala> age
res0: Int = 22
参数
Scala 2的函数有三种参数。
默认参数
:调用函数时不给出明确的具体值,而是使用参数定义时默认的值。带名参数
:调用函数时不按照参数定义的顺序来传递参数,而是使用参数的名字来传递参数值。可变参数
:参数的个数可变。
// 默认参数
scala> def sayHello(fName: String, lName: String = "bear") = fName + " · " + lName
sayHello: (fName: String, lName: String)String
scala> sayHello("xiong")
res0: String = xiong · bear
// 带名参数
scala> sayHello(lName = "xiong", fName = "kefei")
res1: String = kefei · xiong
// 可变参数
scala> :paste
// Entering paste mode (ctrl-D to finish)
def sum(nums: Int*) = {
var sum = 0
for (num <- nums) {
sum += num
}
sum
}
// Exiting paste mode, now interpreting.
sum: (nums: Int*)Int
scala> val res = sum(1, 2, 3, 4)
res: Int = 10
scala> val res = sum(1, 2, 3)
res: Int = 6
过程
在Scala 2中,如果定义函数时没有使用=
连接{}
和{}
前面的部分,函数的返回值类型就是Unit
,这样的函数称之为过程
。
过程
是一种特殊的函数,通常用于不需要返回值的函数。
将函数的返回值类型显式地定义为Unit
,也是过程
。
// 第一种定义过程的方法
scala> def sayHello1(name: String) {"hello, " + name}
scala> sayHello1("xiong")
// 第二种定义过程的方法
scala> def sayHello2(name: String): Unit = {"hello, " + name}
scala> sayHello2("xiong")
Lazy
在Scala 2中,如果变量声明时带上Lazy
关键字,那么只有在真正使用它时,变量对应的表达式才会执行计算。
scala> import scala.io.Source._
import scala.io.Source._
// 仅定义,未使用,此时文件还不存在
scala> lazy val lines = fromFile("~/Downloads/test.txt").mkString
lines: String = <lazy>
// 使用时才真正读取
scala> lines
res4: String =
......
// 如果不加lazy关键字则会报错,因为文件不存在
scala> val lines = fromFile("~/Downloads/test.txt").mkString
java.io.FileNotFoundException: ~/Downloads/test.txt (No such file or directory)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:195)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at scala.io.Source$.fromFile(Source.scala:94)
at scala.io.Source$.fromFile(Source.scala:79)
at scala.io.Source$.fromFile(Source.scala:57)
... 28 elided
感谢支持
更多内容,请移步《超级个体》。