Scala中定義函數的方法:method
定義函數最通用的方法是作為某個對象的成員。這種函數被稱為方法: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里的函數概念比方法更寬泛。
【相關閱讀】