在 ScalaCheck 中生成选项[T]

2024-02-16

我试图在 ScalaCheck 中生成可选参数,但没有成功。

似乎没有直接的机制可以实现这一点。Gen.containerOf[Option, Thing](thingGenerator)失败,因为它找不到隐式Buildable[Thing, Option].

I tried

for {
  thing <- Gen.listOfN[Thing](1, thingGenerator)
} yield thing.headOption

但这不起作用,因为listOfN生成一个长度始终为 N 的列表。结果我总是得到一个Some[Thing]。相似地,listOf1不起作用,因为(a)它不会产生空列表,而且(b)它效率低下,因为我无法设置元素数量的最大限制。

我怎样才能生成Option[Thing]其中包括无?

EDIT: 我已经找到了解决方案,但它并不简洁。还有比这更好的方法吗?

for {
  thing <- for {
    qty <- Gen.choose(0,1)
    things <- Gen.listOfN[Thing](qty, thingGenerator)
  } yield things.headOption
} yield thing

EDIT 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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 ScalaCheck 中生成选项[T] 的相关文章

随机推荐