我的第一个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)
这个方法做什么用的?
不错。比上一个强多了。