2017-08-23 10 views
0
def mayBeTwice(b:Boolean,i: =>Int) = { 
    val j = i 

    if (b) j+j else 0 
} 
def mayBeTwice(b:Boolean,i: =>Int) = { 
    lazy val j = i 

    if (b) j+j else 0 
} 
val x=Stream.mayBeTwice(true,{println("hi");41+1}) 

上記のコードの実行は同じ結果ですが、これはScalaブックの関数型プログラミングで説明したものではありません。新しいScalaの遅延識別子に変更はありますか?

+0

期待される動作と内容を教えてください。 – Pavel

+1

あなたは 'false'を送るべきです、結果はもはや同じではありません。 –

答えて

0

本の読み方とどのように違いますか? lazy valは、最初の使用まで評価を遅らせます。あなたのコードは同じように見えるかもしれませんが、それは異なっています。 falseを送信すると、jは評価されません。これは明らかに可能性があります

def mayBeTwice(b:Boolean, i:Int) = { 
    lazy val j = { println("hi"); i } 
    if (b) j+j else 0 
} 

REPLから:第2のケースで

scala> mayBeTwice(true,10) 
hi 
res10: Int = 20 
scala> mayBeTwice(false,20) 
res11: Int = 0 

を、jが評価されることはありません。

関連する問題