Scala中定义函数的方法:method

开发 后端
本文节选自Martin Odersky,Lex Spoon和Bill Venners所著,Regular翻译的《Programming in Scala》的第八章。Scala是一种针对 JVM 将函数和面向对象技术组合在一起的编程语言。

定义函数最通用的方法是作为某个对象的成员。这种函数被称为方法:method。作为例子,代码8.1展示了两个可以合作根据一个给定的文件名读文件并打印输出所有长度超过给定宽度的行的方法。每个打印输出的行前缀它出现的文件名:

  1. import scala.io.Source  
  2. object LongLines {  
  3.   def processFile(filename: String, width: Int) {  
  4.     val source = Source.fromFile(filename)  
  5.     for (line < - source.getLines)  
  6.       processLine(filename, width, line)  
  7.   }  
  8.   private def processLine(filename:String, width:Int, line:String) {  
  9.     if (line.length > width)  
  10.       println(filename+": "+line.trim)  
  11.   }  
  12. }  
代码 8.1 带私有的processLine方法的LongLines对象

processFile方法带了filename和width做参数。它用文件名创建了一个Source对象并,在for表达式的发生器中,对source调用getLines。第3章的第十二步曾经提到,getLines返回一个枚举器,能在每一次枚举中从文件里取出一行,包括换行符。for表达式通过调用帮助方法,processLine,处理所有的文件行。processLine方法带三个参数:filename,width和line。它检查是否文件行的长度超过给定长度,如果是,就打印文件名,跟着一个冒号,然后是文件行。

为了从命令行里使用LongLines,我们需要创建一个应用,把第一个命令行参数当作行长度,并把后续的参数解释为文件名:本书中,我们通常不会在例子程序中检查命令行参数的合法性,这既是为了保护林木资源,也是为了减少会模糊例子重点部分的套路代码。作为交换就是,当输入错误时,代之以产生有助的错误信息,我们的例子程序将抛出异常。 

  1. object FindLongLines {  
  2.  def main(args: Array[String]) {  
  3.   val width = args(0).toInt  
  4.   for (arg < - args.drop(1))  
  5.    LongLines.processFile(arg, width)  
  6.  }  
  7. }  
下面是如何使用这个应用程序去发现LongLines.scala里超过45字符长度的行(只有一行):

  1. $ scala FindLongLines 45 LongLines.scala  
  2. LongLines.scala: def processFile(filename: String, width: Int) {  

到此为止,这些与你能用面向对象语言做的很像。然而Scala里的函数概念比方法更宽泛。

【相关阅读】

  1. 继续领悟函数式:Scala指令式风格代码的重构
  2. 学习Scala的变量范围
  3. Scala:match表达式、break和continue
  4. 学习Scala:使用try-catch表达式处理异常
  5. Scala中的for表达式:枚举的“瑞士军刀”

责任编辑:book05 来源: Artima
相关推荐

2017-05-15 10:50:42

PythonBound MethoUnbound Met

2009-07-22 07:53:00

Scala无参数方法

2023-11-29 07:47:29

Golang函数

2009-07-20 16:56:51

Scala类的定义

2009-12-11 10:42:00

Scala讲座类定义构造函数

2009-07-22 08:57:49

Scalafinal

2009-07-08 16:52:29

ScalaScala教程

2013-07-30 13:35:12

methodfunction

2017-03-07 15:13:28

Scala偏函数函数

2009-07-22 07:42:00

Scala偏应用函数

2023-09-12 07:38:36

C++getline函数

2009-07-21 17:26:09

Scala本地函数

2009-07-22 08:34:47

Scala方法和字段

2009-07-22 07:57:00

ScalaCurry化函数

2009-07-22 09:22:20

Scala工厂对象

2009-06-17 13:26:06

scala继承模型

2023-06-30 17:56:31

Scala元组

2009-09-24 09:41:00

Scala讲座Scala

2009-07-21 12:18:37

ScalaRational对象toString

2009-12-11 10:44:00

Scala讲座函数 scala
点赞
收藏

51CTO技术栈公众号