[英]Generate Option[T] in ScalaCheck
我試圖在ScalaCheck中生成可選參數,但沒有成功。
似乎沒有直接機制。 Gen.containerOf[Option, Thing](thingGenerator)
失敗,因為它無法找到隱式的Buildable[Thing, Option]
。
我試過了
for {
thing <- Gen.listOfN[Thing](1, thingGenerator)
} yield thing.headOption
但這不起作用,因為listOfN
生成一個總長度為N的列表。因此,我總是得到Some[Thing]
。 類似地, listOf1
不起作用,因為(a)它不產生空列表,但是(b)它效率低,因為我不能設置元素數量的最大限制。
如何生成包含Nones的Option[Thing]
?
編輯 :我找到了解決方案,但它並不簡潔。 有比這更好的方法嗎?
for {
thing <- for {
qty <- Gen.choose(0,1)
things <- Gen.listOfN[Thing](qty, thingGenerator)
} yield things.headOption
} yield thing
編輯2 :我將此概括為
def optional[T](g: Gen[T]) =
for (qty <- Gen.choose(0, 1); xs <- Gen.listOfN[T](qty, g)) yield xs.headOption
所以我不必多次寫它。 但肯定這已經在圖書館了,我只是錯過了它?
現在你可以使用:
Gen.option(yourGen)
您可以使用pick
在Some和None生成器之間隨機選擇:
val someThing = thingGenerator.map( Some.apply )
val noThing = Gen.value( None:Option[Thing] )
val optThing = Gen.oneOf( someThing, noThing )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.