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

ここでは問題ありません。この例でケースクラスが使用されている理由は、Tree示されているのが代数的データ型であり、ケースクラスで可能になっているためです。left通常のクラスでは、ツリー上でパターンマッチを行うことはできません。実際、を宣言せずrightに取得することもできません。vval

于 2010-09-07T15:35:31.093 に答える
2

これは正常に機能するはずです。ScalaCheckに関する限り、ケースクラスに関して特に魔法のようなケースクラスについては何もありません。古いクラスはジェネレーターを取得できます。また、任意に変換することもできます。

テストに関する限り、1つの違いは、生成するすべての非ケースクラスツリーが一意であるため、生成する2つのツリーがtree1==tree2になることはないということです。これは、同一性ではなく値に基づいて同等性をテストするケースクラスの場合とは異なります。値ベースの同等性ではなくIDベースの同等性がある場合に可能になるエイリアシングの問題を処理するには、さらに多くのテストが必要になる場合があります。

于 2010-09-07T15:46:07.487 に答える