Каким образом функции с побочными эффектами лучше всего обрабатываются для понимания в Scala?Как обеспечить, чтобы ресурс был закрыт для понимания в Scala
У меня есть для понимания, который начинается с создания своего рода ресурса (х) путем вызова функции f1. Этот ресурс имеет близкий -метод, который должен быть назван в конце, но если для постижение не может каким-то образом (если
Так что у нас что-то вроде:.
import scala.util.{Try,Success,Failure}
trait Resource {
def close() : Unit
}
// Opens some resource and returns it as Success or returns Failure
def f1 : Try[Resource] = ...
def f2 : Try[Resource] = ...
val res = for {
x <- f1
y <- f2
} yield {
(x,y)
}
Где я должен позвонить метод close? Я могу назвать его в конце понимания для последнего в качестве последнего заявления (z < - x.close), в части yield или после понимания (res._1.close). из них гарантирует, что закрыть вызывается при возникновении ошибки (например, если f2 не работает). С другой стороны, я мог бы отделить
x <- f1
из-за понимания, как это:
val res = f1
res match {
case Success(x) => {
for {
y <- f2
}
x.close
}
case Failure(e) => ...
:
Это обеспечило бы вызов близко, но не очень хороший код. Разве нет более умного и более чистого способа добиться того же?
возможно дубликат [? Какие альтернативы автоматического управления ресурсами существует для Scala] (http://stackoverflow.com/questions/2207425/what-automatic-resource-management -alternatives-exists-for-scala) – jopasserat