2014-12-26 3 views
1

실행하지 않고 메소드에 코드 블록을 통과 :내가 다음 코드 한

import java.io._ 
import com.twitter.chill.{Input, Output, ScalaKryoInstantiator} 

import scala.reflect.ClassTag 

object serializer { 

    val instantiator = new ScalaKryoInstantiator 
    instantiator.setRegistrationRequired(false) 
    val kryo = instantiator.newKryo() 

    def load[T](file:_=>_,name:String,cls:Class[T]):T = { 
    if (java.nio.file.Files.notExists(new File(name).toPath())) { 
     val temp = file 
     val baos = new FileOutputStream(name) 
     val output = new Output(baos, 4096) 
     kryo.writeObject(output, temp) 
     temp.asInstanceOf[T] 
    } 
    else { 
     println("loading from " + name) 
     val baos = new FileInputStream(name) 
     val input = new Input(baos) 
     kryo.readObject(input,cls) 
    } 
    } 
} 
나는이 방법을 사용하려는

:

val mylist = serializer.load((1 to 100000).toList,"allAdj.bin",classOf[List[Int]]) 

내가 그렇게 (1 to 100000).toList 때마다 실행하지 않으 serializer에 전달한 다음 처음으로 계산하여 미래에 직렬화하거나 파일에서로드하려고합니다.

문제는 코드 블록이 내 코드에서 먼저 실행된다는 것입니다. 어떻게 실행하지 않고 코드 블록을 전달할 수 있습니까?

P. 나에게 정확한 작업을 수행하는 스칼라 도구가 있습니까? 매개 변수가 전달되기 전에 평가하지 않은려면

답변

2

, 사용은 패스에 의해 이름이 같은 : 당신은 당신이 통과 할 때 평가되지 않습니다 통과하지만, 각 평가한다 무엇 이건

def method(param: =>ParamType) 

시간은 param입니다. 원하지 않을 수도 있습니다. 당신이 사용하는 첫 번째 시간을 평가할 수있는하려면 다음을 수행하십시오

def method(param: =>ParamType) = { 
    lazy val p: ParamType = param 

그런 다음 몸에만 p를 사용합니다. 처음으로 p이 사용되면 param이 평가되고 값이 저장됩니다. p을 다른 용도로 사용하면 저장된 값이 사용됩니다.

이것은 method을 호출 할 때마다 발생합니다. 즉, method을 두 번 호출하면 p의 "stored"값을 사용하지 않고 첫 번째 사용시 다시 평가합니다. "사전 계산"을 원한다면, 대신 클래스를 사용하는 것이 더 나을 것입니다.