2

在 scalacheck 的用户指南中有“生成案例类”段落。我从中修改了示例以使用常规类而不是案例类:

import org.scalacheck._
import Gen._
import Arbitrary._

sealed abstract class Tree
object Leaf extends Tree
class Node(left:Tree, rigth:Tree, v:Int) extends Tree

object Main {

  val genLeaf = value(Leaf)
  val genNode = for{
    v <- Arbitrary.arbitrary[Int]
    left <- genTree
    rigth <- genTree
  } yield new  Node(left, rigth, v)

  val genTree:Gen[Tree] = oneOf(genLeaf, genNode)


  def main(args:Array[String]){    
    println(genTree.sample)
  }
}

似乎一切正常,但在我在这里问之前我害怕在生产代码中使用这种方法:有什么陷阱吗?

4

2 回答 2

2

这应该可以正常工作。就 ScalaCheck 而言,案例类没有什么特别神奇的地方。任何旧类都可以获得生成器,甚至可以转换为任意类。

就测试而言,一个区别是您生成的每个非案例类树都是唯一的,因此对于您生成的任何两棵树都不会是 tree1 == tree2。这与 case 类不同,后者基于值而不是身份来测试相等性。您可能需要更多测试来处理当您具有基于身份而不是基于值的相等性时可能出现的别名问题。

于 2010-09-07T15:46:07.487 回答
2

我认为这里没有问题。在该示例中使用案例类的原因是Tree显示的是代数数据类型,可以使用案例类。使用普通类,您无法在树上进行模式匹配,事实上,您甚至无法获取left,right并且v不声明它们val

于 2010-09-07T15:35:31.093 回答