接着昨天的进度继续学习scala,现在的所有东西仅仅是借助课本的帮助,在scala的交互式shell中进行简单的写一下代码,也想借此学习一下最基本的语法,掌握基础,下面是今天 的笔记记录内容:
1.识别函数式风格
在scala中,val 和 var 只不过是你工具箱里两种不同的工具,它们都很有用。
def printArgs(args: Array[String]): Unit = {
var i = 0
while (i < args.length) {
println(args(i))
i += 1
}
}
你可以通过去掉 var 的办法把这个代码变得更函数式风格,例如,像这样:
def printArgs(args: Array[String]): Unit = {
for (arg <- args)
println(arg)
}
或这样:
def printArgs(args: Array[String]): Unit = {
args.foreach(println)
}
减少使用var的一个好处:重构后(更函数式)的代码比原来(更指令式)的代码更简洁,明白,也更少机会犯错。Scala鼓励函数式风格的原因,实际上也就是因为函数式风格可以帮助你写出更易读懂,更不容易犯错的代码
重构后的 printArgs 方法并不是纯函数式的,因为它有副作用——本例中,其副作用是打印到标准输出流。函数有副作用的马脚就是结果类型为 Unit。如果某个函数不返回任何有用的值,就是说其结果类型为Unit,那么那个函数唯一能让世界有点儿变化的办法就是通过某种副作用。更函数式的方式应该是定义对需打印的 arg 进行格式化的方法,但是仅返回格式化之后的字串,如下:
def formatArgs(args: Array[String]) = args.mkString("\n")
println(formatArgs(args))
可以通过检查结果来测试 formatArgs:
val res = formatArgs(Array("沂", "水", "寒","城"))
assert(res == "沂\n水\n寒\n城")
Scala 的 assert 方法检查传入的 Boolean 并且如果是假,抛出 AssertionError。如果传入的 Boolean 是真, assert 只是静静地返回。
结果如下:
scala> def formatArgs(args: Array[String]) = args.mkString("\n")
formatArgs: (args: Array[String])String
scala> val res = formatArgs(Array("沂", "水", "寒","城"))
res: String =
沂
水
寒
城
scala> assert(res == "沂\n水\n寒\n城")
参考:
《scala编程中文版》
上一篇博客给出了下载链接