Scala 构造具有多个字段的Create类的简洁方法?

Scala 构造具有多个字段的Create类的简洁方法?,scala,Scala,给定一个案例类: scala> case class Foo(a: String, b: String, c: String, d: String, e: String, f: Int, g: String, h: String, i: Int) defined class Foo 我有一个函数:f:Foo=>Int,我需要测试f(Foo)==1 出于测试目的,是否有一种简洁的方法来创建一个case类(不定义每个字段) 我考虑过对字段进行惰

给定一个案例类:

scala> case class Foo(a: String, b: String, c: String, d: String, 
                       e: String, f: Int, g: String, h: String, i: Int)
defined class Foo
我有一个函数:
f:Foo=>Int
,我需要测试
f(Foo)==1

出于测试目的,是否有一种简洁的方法来创建一个case类(不定义每个字段)

我考虑过对字段进行惰性评估,然后使用
,但是:

scala> case class Bar(a: => Int)
<console>:1: error: `val' parameters may not be call-by-name
case class Foo(a: => Int)
                  ^
scala>case类栏(a:=>Int)
:1:错误:`val'参数不能按名称调用
案例类Foo(a:=>Int)
^
编辑


我请求的答案不包括默认参数。

您可以为所有参数提供默认值,并使用您想要的参数创建一个
Foo

case class Foo(a : String = "", b : String = "", c : String = "" ... )
然后,您可以使用所有默认值创建一个
Foo

val f = Foo()
或者使用特定参数创建一个

val f = Foo(a = "a", b = "b")   // the rest will have the default values

您可以为所有参数提供默认值,并使用所需参数创建一个
Foo

case class Foo(a : String = "", b : String = "", c : String = "" ... )
然后,您可以使用所有默认值创建一个
Foo

val f = Foo()
或者使用特定参数创建一个

val f = Foo(a = "a", b = "b")   // the rest will have the default values

我不明白为什么要排除默认值,但是如果在构建Foo实例的每种情况下都需要不同的默认值,那么我认为,您需要的是一个工厂对象。可能是这样的:

object FooFactory {
  def apply(a: String): Foo = Foo(a, "b", ... "k", 1)
  def apply(b: String): Foo = Foo("a1", b, ... "k1", 2)
  //add an apply overload for every combination you need
}

我不明白为什么要排除默认值,但是如果在构建Foo实例的每种情况下都需要不同的默认值,那么我认为,您需要的是一个工厂对象。可能是这样的:

object FooFactory {
  def apply(a: String): Foo = Foo(a, "b", ... "k", 1)
  def apply(b: String): Foo = Foo("a1", b, ... "k1", 2)
  //add an apply overload for every combination you need
}

不确定这样的东西是否是你想要的,但是:

% sbt                                                                                                     
...
> set scalaVersion := "2.11.7"
...
> set libraryDependencies += "org.cvogt" %% "scalacheck-extensions" % "0.2"
...
> console
Welcome to Scala version 2.11.7 (...)
...

scala> case class Foo(a: String, b: String, c: String, i: Int)
defined class Foo

scala> import org.cvogt.scalacheck.GenTree
import org.cvogt.scalacheck.GenTree

scala> case class Foo(a: String, b: Double, c: Int)
defined class Foo

scala> GenTree.partialTree[Foo].sample
res0: Option[Foo] = Some(Foo(ᐊ沄⎤...,8.646125633001667E248,0))

是的

不确定这样的东西是否是你想要的,但是:

% sbt                                                                                                     
...
> set scalaVersion := "2.11.7"
...
> set libraryDependencies += "org.cvogt" %% "scalacheck-extensions" % "0.2"
...
> console
Welcome to Scala version 2.11.7 (...)
...

scala> case class Foo(a: String, b: String, c: String, i: Int)
defined class Foo

scala> import org.cvogt.scalacheck.GenTree
import org.cvogt.scalacheck.GenTree

scala> case class Foo(a: String, b: Double, c: Int)
defined class Foo

scala> GenTree.partialTree[Foo].sample
res0: Option[Foo] = Some(Foo(ᐊ沄⎤...,8.646125633001667E248,0))

awwwww是的

我将更新我的问题以排除默认参数我将更新我的问题以排除默认参数您可以使用函数文本作为案例类的参数:
案例类Foo(a:()=>Int)
。但我不确定我是否理解您试图实现的目标。您是否需要仅创建一个实例,或者创建多个实例以进行测试而不提供所有参数?您可以使用函数文本作为案例类的参数:
case class Foo(a:()=>Int)
。但我不确定我是否理解您试图实现的目标。您是否需要只创建一个实例,还是能够创建多个实例进行测试而不提供所有参数?