2014-12-26 5 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 каждый раз, так Я хочу передать его в сериализатор, а затем решить сначала вычислить его и сериализовать его в будущем или загрузить его из файла.

Проблема в том, что кодовый блок работает первым в моем коде, как я могу передать блок кода без его выполнения?

P.S. Есть ли какой-нибудь инструмент scala, который делает для меня точные вещи?

ответ

2

Чтобы иметь параметры не будут оценены перед передачей, использование пройти по имени, например:

def method(param: =>ParamType) 

Все, что вы передаете не будет оцениваться на момент прохождения, но будет оцениваться каждый вы используете param, что может и не быть тем, что вы хотите. Чтобы это оценить только первый раз, когда вы используете, выполните следующие действия:

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

Затем используйте только p на теле. В первый раз используется p, будет оцениваться param и значение будет сохранено. Все остальные виды использования p будут использовать сохраненное значение.

Обратите внимание, что это происходит каждый раз, когда вы вызываете method. То есть, если вы дважды назовете method, он не будет использовать «сохраненное» значение p - он будет оценивать его снова при первом использовании. Если вы хотите «заранее вычислить» что-то, то, может быть, вам будет лучше с классом?