Scala可变参数和case类

3
如何测试构造函数的可变参数长度。
我正在定义一个带有点序列的case class polygon,我想使用require语句确保点的数量至少为5个。
case class Point(x: Int, y: Int)
case class Polygon(points: Point*)  {
// require(point >= 3) }
2个回答

6
这个怎么样?
如何评价这个?
 case class Point(x: Int, y: Int)
 case class Polygon(a: Point, b: Point, c: Point, d: Point, e: Point, other: Point*)  {
  def points = Vector(a,b,c,d,e) ++ other
}

然后:

val p1 = Point(1,1)
val p2 = Point(2,1)
val p3 = Point(3,1)
val p4 = Point(4,1)
val p5 = Point(5,1)
val p6 = Point(6,1)
val p7 = Point(7,1)

val polygon5 = Polygon(p1,p2,p3,p4,p5)
println(polygon5.points)
// Vector(Point(1,1), Point(2,1), Point(3,1), Point(4,1), Point(5,1))

val polygon7 = Polygon(p1,p2,p3,p4,p5,p6,p7)
println(polygon7.points)
// Vector(Point(1,1), Point(2,1), Point(3,1), Point(4,1), Point(5,1), Point(6,1), Point(7,1))

Polygon(p1,p2,p3,p4)  // error: not enough arguments for method apply

这是一种更好的实现方式。将需求移入类型系统中。 - Ryan
1
希望他的下一个请求不会是“具有偶数个点的向量”或“至少有42个点的向量”。 - vptheron

4
将这个要求转移到编译时,方法是让类接受5个“Point”参数,然后是一个“Point*”可变参数,这通常是你最好的选择(如dhg的回答所示)。如果你想使用“require”,那么就很简单了。
case class Polygon(points: Point*)  {
    require(points.length >= 5, "Must have at least 5 points") 
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接