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