2017-12-29 6 views
1

ルーキーミスのように聞こえるかもしれませんが、私はそれをたくさんしています。怠惰な評価されたブロックまたは値を関数に渡している間に、どうか忘れてしまった場合は、 が評価を強制するため、関数の対応するパラメータを怠け者(パス/名前で呼ぶ)Scalaでは遅延引数を渡すための助けはありますか?

lazy val a = {println("a");1} 
def myfunc(b:Int){println("hello")} 
myfunc(a); 

出力:

a 
Hello 

だから私の質問は、この問題の任意のコンパイラのヘルプには、(フラグなど)があるか、これは私が世話をする必要がありますものの一種でありますか?

+0

コンパイラはあなたが '=> Int'を意味するがIntを書いたことを検出するために注意を払うことができますか? –

+0

その関数に渡され、遅延としてマークされたパラメータ – altayseyhan

+1

遅延型変数を値で関数に渡すことは、他の方法でも同じです。ある時点で評価が行われる必要があります。コンパイラは、起こっている場所が実際に起こった場所であるかどうかをどのようにして判断するのか、それは問題です。 – Dima

答えて

1

問題をタイプシステムに移すことができます。

  1. 代わりに...
  2. は遅延評価値用のボックスを定義し、明示的lazy val Sを使用しないでください:

class Lazy[A](body: => A) { 
    lazy val value = body 
} 

object Lazy { 
    def apply[A](body: => A) = new Lazy[A](body) 
} 

今、あなたが助けの少しを持っていますコンパイラから:

val a = Lazy { 
    println("a") 
    1 
} 

def myfunc(b: Lazy[Int]) = { 
    println("hello") 
} 

myfunc(a) // ok, and it doesn't print "a" since it never uses it 
// myfunc(42) // won't compile 

def myfunc2(b: Int) = b + 42 

// myfunc2(a) // does not compile 
myfunc2(a.value) // ok, explicitly evaluate - or consider refactoring myfunc2 
関連する問題