定义函数最通用的方法是作为某个对象的成员。这种函数被称为方法:method。作为例子,代码8.1展示了两个可以合作根据一个给定的文件名读文件并打印输出所有长度超过给定宽度的行的方法。每个打印输出的行前缀它出现的文件名:
代码 8.1 带私有的processLine方法的LongLines对象
- import scala.io.Source
- object LongLines {
- def processFile(filename: String, width: Int) {
- val source = Source.fromFile(filename)
- for (line < - source.getLines)
- processLine(filename, width, line)
- }
- private def processLine(filename:String, width:Int, line:String) {
- if (line.length > width)
- println(filename+": "+line.trim)
- }
- }
processFile方法带了filename和width做参数。它用文件名创建了一个Source对象并,在for表达式的发生器中,对source调用getLines。第3章的第十二步曾经提到,getLines返回一个枚举器,能在每一次枚举中从文件里取出一行,包括换行符。for表达式通过调用帮助方法,processLine,处理所有的文件行。processLine方法带三个参数:filename,width和line。它检查是否文件行的长度超过给定长度,如果是,就打印文件名,跟着一个冒号,然后是文件行。
为了从命令行里使用LongLines,我们需要创建一个应用,把第一个命令行参数当作行长度,并把后续的参数解释为文件名:本书中,我们通常不会在例子程序中检查命令行参数的合法性,这既是为了保护林木资源,也是为了减少会模糊例子重点部分的套路代码。作为交换就是,当输入错误时,代之以产生有助的错误信息,我们的例子程序将抛出异常。
下面是如何使用这个应用程序去发现LongLines.scala里超过45字符长度的行(只有一行):
- object FindLongLines {
- def main(args: Array[String]) {
- val width = args(0).toInt
- for (arg < - args.drop(1))
- LongLines.processFile(arg, width)
- }
- }
- $ scala FindLongLines 45 LongLines.scala
- LongLines.scala: def processFile(filename: String, width: Int) {
到此为止,这些与你能用面向对象语言做的很像。然而Scala里的函数概念比方法更宽泛。
【相关阅读】