gpt4 book ai didi

scala - 如何创建案例类的随机实例?

转载 作者:行者123 更新时间:2023-12-04 05:36:19 25 4
gpt4 key购买 nike

假设我有几个案例类,例如:

case class C(c1: Int, c2: Double, c3: Option[String])
case class B(b: Int, cs: Seq[C])
case class A(a: String, bs: Seq[B])

现在,我想生成一些带有随机值的 A实例进行测试。

我正在寻找一种通用的方式来做到这一点。我可能可以通过运行时反射来做到这一点,但我更喜欢编译时解决方案。
def randomInstance[A](a: A): A = ???

我该怎么做 ?可以用 shapeless完成吗?

最佳答案

最简单的方法是使用ScalaCheck。为此,您可以为实例定义一个Gen[A]:

import org.scalacheck.Gen

final case class C(c1: Int, c2: Double, c3: Option[String])
object C {
val cGen: Gen[C] = for {
c1 <- Gen.posNum[Int]
c2 <- Gen.posNum[Double]
c3 <- Gen.option(Gen.oneOf("foo", "bar", "hello"))
} yield C(c1, c2, c3)
}

然后消耗掉它:
object F {
def main(args: Array[String]): Unit = {
val randomC: C = C.cGen.sample.get
}
}

最重要的是,您可以添加 scalacheck-shapeless,它会为您生成具有完全随机值(您无法控制它们)的 Gen[A]

您可能还需要研究 random-data-generator(感谢@Gabriele Petronella),它进一步简化了事情。从文档中:
import com.danielasfregola.randomdatagenerator.RandomDataGenerator

object MyApp extends RandomDataGenerator {

case class Example(text: String, n: Int)

val example: Example = random[Example]
// Example(ਈ䈦㈾钜㔪旅ꪔ墛炝푰⡨䌆ᵅ퍧咪, 73967257)
}

这在 property based testing中也特别有用。

关于scala - 如何创建案例类的随机实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50666251/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com