2011-02-28 2 views
19

스칼라의 리소스를 열고인가 그것에 방법 (자바 문의 tranlsated)이 방법보다 vals를 사용뿐만 아니라 등 최종적 포함한 더 숙어 방법이/w기능성 시도 및 캐치 스칼라

var is:FileInputStream = null 
try { 
    is = new FileInputStream(in) 
    func(is) 
} catch { 
    case e:IOException => 
    println("Error: could not open file.") 
    println("  -> " + e) 
    exit(1) 
} finally { 
    if(is) is.close() 
} 
+2

당신은 "자동-자원 관리"라이브러리를 시도 할 수 있습니다. scala-arm/wiki/basic-usage (필자는 사용하지 않았다) – Fabian

+1

Java 7에서 기대할 수있는 몇 가지 기능 중 하나 인 Automatic Resource Management로 알려진 것을 찾고있다. –

답변

18

대출 패턴은 Josh Suereth의 scala-arm 라이브러리 github에서 다양한 방식으로 구현됩니다.

그런 다음 자원이 같은를 사용할 수 있습니다

val result = managed(new FileInputStream(in)).map(func(_)).opt 

Option에 싸여 func의 결과를 반환하고 입력 스트림을 닫는 돌볼 것이다.

이 자원을 생성 가능한 예외 처리하기 위해, 당신은 scala.util.control.Exception 개체와 결합 할 수 있습니다 :은 https : // GitHub의

import resource._ 
import util.control.Exception.allCatch 

allCatch either { 
    managed(new FileInputStream(in)).map(func(_)).opt 
} match { 
    case Left(exception) => println(exception) 
    case Right(Some(result)) => println(result) 
    case _ => 
} 
13

Loan pattern (비활성 링크) non permanent link to new location을 사용하십시오.

+1

+1 ; 나는이 관용구에 이름을 부여했다는 것을 몰랐다. –

+1

스칼라 표준 라이브러리에 표준 구현이 있습니까? 아니면 util 모듈에서 직접 구현해야합니까? –

+0

@aharon 답변 아래의 주석보기 - Josh Suereth의 ARM 라이브러리가이 작업을 수행합니다. –

5

기능적으로 바람직하지 않은 경우가 있습니다. allready 언급 된 대출 패턴은 오류 처리의 imparative 버전의 캡슐화이지만 함수 프로그래밍과는 아무런 관련이 없으며 오류 처리도 처리합니다.

실제로 기능을 원한다면 error handling monad으로 할 수 있습니다. 스칼라 (Scala)가 이런 종류의 "하드 코어 (hardcore)"기능을 잘 지원하지 않기 때문에 좋은 이유에서 내가 제공 한 링크는 하스켈의 특정 문서이다.

필자는 명령형으로 가서 마지막으로 catch를 사용하는 것이 좋습니다. 오류 처리로 대출 패턴을 확장 할 수도 있지만 오류를 다르게 처리하려면 특수 기능을 작성해야한다는 의미입니다. 어떤 상황이나 오류 처리를위한 부분 함수를 전달해야합니다 (코드에서 catch 블록 안에 이미있는 것 외에는 아무것도 아닙니다).

+0

의미가 있습니다. 고맙습니다! –

+0

우리는 이것을 위해 모나드가 필요합니까? 하스켈에서는 Scalaz에서도 구현되는 '브래킷 (bracket)'함수, http://hackage.haskell.org/package/base-4.9.0.0/docs/Control-Exception-Base.html#v:bracket이 있습니다. –