복붙노트

[SCALA] 스칼라에서 대 부자 패턴

SCALA

스칼라에서 대 부자 패턴

깊이에서 스칼라는 대여자 패턴을 보여줍니다

def readFile[T](f: File)(handler: FileInputStream => T): T = {
  val resource = new java.io.FileInputStream(f)
  try {
    handler(resource)
  } finally {
      resource.close()
  }
}

사용 예제 :

readFile(new java.io.File("test.txt")) { input =>
   println(input.readByte)
}

이 코드는 간단하고 명확 나타납니다. 나는 그것을 피하는 방법을 알 수 있도록 스칼라의 대 부자 패턴의 "반 패턴은"무엇입니까?

해결법

  1. ==============================

    1.확인 무엇 이건 당신은 컴퓨팅 간절히 평가되지 않고 더 이상 자원에 따라 달라집니다. 스칼라는 게으른 계산이 매우 쉽습니다. 이 방법으로 scala.io.Source.fromFile을 포장하는 경우 예를 들어, 당신은 시도 할 수 있습니다

    확인 무엇 이건 당신은 컴퓨팅 간절히 평가되지 않고 더 이상 자원에 따라 달라집니다. 스칼라는 게으른 계산이 매우 쉽습니다. 이 방법으로 scala.io.Source.fromFile을 포장하는 경우 예를 들어, 당신은 시도 할 수 있습니다

    readFile("test.txt")(_.getLines)
    

    getLines 게으른 (반환 반복자)이기 때문에 불행히도,이 작동하지 않습니다. 그리고 스칼라는 게으른하고있는이되지 않는 방법을 나타 내기 위해 어떤 좋은 방법이 없습니다. 그냥 알고있다 그래서 (문서는 당신에게 경향), 당신은 실제로 반환하기 전에 작업을해야 :

    readFile("test.txt")(_.getLines.toVector)
    

    전반적으로, 그것은 매우 유용한 패턴입니다. 그냥 확인 리소스에 대한 모든 액세스가 블록 (그래서 아무되지 않은 선물, 자원, 아니 반복자에 따라 더 게으른 놈들을 종료하기 전에 완료되었는지 확인에는이 자원 자체를 반환 완전하지 않은 어떤 스트림을 읽 등 . 그들은 열려있는 자원에 있지만 자원을 기반으로 일부 완전히 계산 된 양)에 의존하지 않는 경우 물론 어떤 이런 것들 괜찮의.

  2. ==============================

    2.차관 패턴으로 실제로 당신의 대여 리소스를 호출하는 것입니다 코드의 "비트"를 사용하려고 할 때 아는 것이 중요합니다.

    차관 패턴으로 실제로 당신의 대여 리소스를 호출하는 것입니다 코드의 "비트"를 사용하려고 할 때 아는 것이 중요합니다.

    당신이 대출 패턴에서 미래를 반환 할 경우 나는 대출 패턴 함수에 전달되는 함수의 내부를 작성하지 않는 것이 좋습니다.

    쓰지 마십시오

    readFile("text.file")(future { doSomething })
    

    하지만 수행

    future { readFile("text.file")( doSomething ) }
    

    동기 및 비동기 : 제가 주로하는 일은 내가 대출 패턴 두 가지 유형의 함수를 정의하는 것입니다

    따라서 귀하의 경우에는 내가 것이다 :

    def asyncReadFile[T](f: File)(handler: FileInputStream => T): Future[T] = {
      future{
        readFile(f)(handler)
      }
    }
    

    당신이 폐 자원을 호출하지 않도록이 방법. 그리고 당신은 동기 기능의 당신의 이미 테스트하고 희망 올바른 코드를 다시 사용합니다.

  3. from https://stackoverflow.com/questions/20762240/loaner-pattern-in-scala by cc-by-sa and MIT license