Как обобщить метод? - PullRequest
       1

Как обобщить метод?

0 голосов
/ 19 марта 2012

Я пытаюсь обобщить следующий код:

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 ]

1 голос
/ 20 марта 2012

Вы можете проверить, является ли строка 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
    }
0 голосов
/ 20 марта 2012

Самое простое решение состоит в том, чтобы иметь один метод, который извлекает данный Source, и два метода-оболочки, которые создают Source из File или 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...