なにが問題ですか?なぜ人は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 johnasを宣言すると、この例は機能しlazyます。lazy val arbPersonそのため、 が の前に実行されているように見えますが、そうであれば、scala コンパイラはそれが定義されていないval johnと言って失敗するはずです。もでもないので、宣言されてインスタンス化されているかどうかのどちらかです。johnjohnvalvar
これについて何か考えはありますか?
PS: スカラ 2.10.3