なにが問題ですか?なぜ人はnullですか?
import org.scalacheck.{Arbitrary, Properties, Gen, Prop}
import Gen._
import Prop._
case class Person(name: String) {}
object QuickCheckPerson extends Properties("Person") {
property("gen1") = forAll { (person: Person) =>
println("person: " + person)
person.name == "john" // nullPointerException, because person == null
}
val john = Person("john")
implicit lazy val arbPerson: Arbitrary[Person] = Arbitrary(value(john))
}
QuickCheckPerson.check
NullPointerException で失敗します。
ただし、 のval john = Person("john")
直前に行を移動すると、この例は機能しproperty("gen1") = ...
ます。
どうして??
アップデート
val john
asを宣言すると、この例は機能しlazy
ます。lazy val arbPerson
そのため、 が の前に実行されているように見えますが、そうであれば、scala コンパイラはそれが定義されていないval john
と言って失敗するはずです。もでもないので、宣言されてインスタンス化されているかどうかのどちらかです。john
john
val
var
これについて何か考えはありますか?
PS: スカラ 2.10.3