识别指令式和函数式风格有一个小技巧就是,如果代码包含了任何var变量,那它大概就是指令式的风格。如果代码根本就没有var——就是说仅仅包含val——那它大概是函数式的风格。因此向函数式风格推进的一个方式,就是尝试不用任何var编程,Scala鼓励你使用val进行函数式编码。
先来看一个指令式风格的:
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) }
从上面的代码可以看到函数式风格的代码更简洁、更易读、更少犯错。
但是上面的printArgs并不是纯函数式的,因为它有副作用,其副作用是打印到标准输出流。函数有副作用的马脚就是结果类型为Unit。如果某个函数不返回任何有用的值,就是说其结果类型为Unit,那么那个函数唯一能让世界有点儿变化的办法就是通过某种副作用。
更函数式的风格应该是:
def formatArgs(args: Array[String]) = args.mkString("\n")//没有副作用,返回值打印交由println处理 println(formatArgs(args))//照上面所说println函数是有副作用的<span></span>
牢记:不管是var还是副作用都不是天生邪恶的。Scala不是强迫你用函数式风格编任何东西的纯函数式语言。它是一种指令式/函数式混合的语言。你或许发现在某些情况下指令式风格更符合你手中的问题,在这时候你不应该对使用它犹豫不决。
崇尚val,不可变对象和没有副作用的方法,只有在特定需要和判断之后才选择var,可变对象和有副作用的方法。
时间: 2024-10-10 19:54:36