В проекте Scala 3 у меня есть метод, который возвращает Try из заданной строки.
def translate(text: String) : Try[Thing] = ...
и метод, который должен читать содержимое файла и передавать его первому методу. Здесь я хочу использовать Using
, потому что, насколько я понимаю, это функциональный способ обработки файлового ввода-вывода, и он возвращает Try
, который мне в любом случае нужен, и гарантирует, что используемый ресурс закрыт:
def translateFromFile(filepath: String) : Try[Thing] =
Using(Source.fromFile(filepath).getLines.mkString) match
case Success(s) => translate(s)
case Failure(e) => Failure(e)
Однако компилятор говорит
given instance of type scala.util.Using.Releasable[String] was found for parameter evidence$1 of method apply in object Using
Честно говоря, я не понимаю это сообщение об ошибке и не могу найти никакой помощи в Интернете. Кто-нибудь может помочь? Как правильно это сделать? Спасибо!
Ошибка означает, что вы пытаетесь подставить в Using(...)
не то, что можно закрыть, а String
.
Должен быть
def translateFromFile(filepath: String) : Try[Thing] =
Using(Source.fromFile(filepath)) { s =>
translate(s.getLines.mkString) match {
case Success(s) => ???
case Failure(e) => ???
}
}
или просто
def translateFromFile(filepath: String) : Try[Thing] =
Using(Source.fromFile(filepath)) { s =>
translate(s.getLines.mkString)
}.flatten
Using(...){s => ...}
возвращает Try
, а ваш translate
возвращает Try
, так что это Try[Try[...]]
, поэтому .flatten
.
В Scala 3 нет ничего конкретного.
@MateuszKubuszok да, спасибо Using(Source.fromFile(filepath))(_.getLines.mkString).flatMap(translate)
Вместо
flatten
вы также можете попробоватьUsing(Source.fromFile(filepath)) { s => s.getLines.mkString }.flatMap(translate)
.