我的第一个scala脚本完成的功能就是为文本文件添加行号,不过那个脚本中使用了变量,不太符合scala编程的思想。现在把这个脚本改造了一下,去掉var变量的使用,完全使用val值。另外,把脚本改成了需编译的程序。
LineNumber.scala程序如下:
import scala.io.Source object LineNumber { def main(args: Array[String]) { for (file <- args) { println("File: " + file) println("-" * 32) for (line <- addLineNumber(file)) print(line) } } def addLineNumber(fileName: String): List[String] = { def padding(m: Int, i: Int) = " " * (m - i.toString.length) val lines = Source.fromFile(fileName).getLines.toList val maxWidth = lines.length.toString.length for { (l, i) <- lines.zipWithIndex j = i + 1 line = padding(maxWidth, j) + j + " " + l } yield line } }
这个程序会从命令行获取要添加行号的文件名,把加了行号的文本打印到屏幕上。
用下面的命令编译该程序:
fsc LineNumber.scala
然后可以用下面的命令执行该程序,输出如下:
$ scala -cp . LineNumber LineNumber.scala File: LineNumber.scala -------------------------------- 1 import scala.io.Source 2 3 object LineNumber { 4 def main(args: Array[String]) { 5 for (file <- args) { 6 println("File: " + file) 7 println("-" * 32) 8 for (line <- addLineNumber(file)) 9 print(line) 10 } 11 } 12 13 def addLineNumber(fileName: String): List[String] = { 14 def padding(m: Int, i: Int) = " " * (m - i.toString.length) 15 16 val lines = Source.fromFile(fileName).getLines.toList 17 val maxWidth = lines.length.toString.length 18 19 for { 20 (l, i) <- lines.zipWithIndex 21 j = i + 1 22 line = padding(maxWidth, j) + j + " " + l 23 } yield line 24 } 25 }
学习scala有大半个月了,越来越感受到了scala的简洁与强大。
更多内容,请阅读易水博客上的其它文章。
for (line <- addLineNumber(file))
print(line)
应该是println吧
def padding(m: Int, i: Int) = ” ” * (m – i.toString.length)
这个方法做什么用的?
不错。比上一个强多了。