如何推广一种方法?

时间:2012-03-19 19:41:26

标签: scala

我正在尝试概括以下代码:

def fetchUrl = {
  try {
    val lineList = Source.fromURL(url).getLines.toList
    process(lineList)
  }
  catch {
    case ex: java.net.UnknownHostException => ex.printStackTrace()
  }
}

我希望能够使用相同的方法获取URL(fromURL)和文件(fromFile)。是否可以概括此代码来存档它?

我想我可以使用模式匹配,但我不知道如何。

def fetchSource(src: Source, str: String) = src match {
  case ??? => Source.fromURL(url).getLines.toList
  case ??? => Source.fromFile(str).getLines.toList
}

有没有办法做到这一点?

提前致谢。

2 个答案:

答案 0 :(得分:1)

您可以检查字符串是否为Url(对于此示例,我使用的是java.net.URL,但您也可以使用UrlValidator执行此操作)

这样的事情:

def isUrl(url: String) = try {
        new java.net.URL(url)
        true
    } catch {
        case _ => false
    }


import scala.io.Source

def fetchSource(src:String) = if(isUrl(src)) {
        Source.fromURL(src).getLines.toList
    } else {
        Source.fromFile(src).getLines.toList
    }

答案 1 :(得分:0)

最简单的解决方案是使用一个方法来获取给定的Source,以及两个从SourceFile构建URL的包装方法。

def fetchSource(source: io.Source) =
  try {
    val lineList = source.getLines.toList
    process(lineList)
  } catch {
    case ex: java.net.UnknownHostException => ex.printStackTrace()
  }

def fetchFile(file: java.io.File) = fetchSource(io.Source.fromFile(file))

def fetchUrl(url: java.net.URL) = fetchSource(io.Source.fromURL(url))