簡體   English   中英

在ScalaCheck中生成選項[T]

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM