我有一个案例类,它包含一系列函数:
case class A(q:Double, r:Double, s:Double, l:List[(Double)=>Double])
我定义了20多个函数。其中一些函数有自己的参数,其中一些还使用案例类中的q
,r
和s
值。两个例子是:
def f1(w:Double) = (d:Double) => math.sin(d) * w
def f2(w:Double, q:Double) = (d:Double) => d * q * w
问题是我在实例化案例类时需要引用q
,r
和s
两次:
A(0.5, 1.0, 2.0, List(f1(3.0), f2(4.0, 0.5))) //0.5 is referenced twice
我希望能够像这样实例化这个类:
A(0.5, 1.0, 2.0, List(f1(3.0), f2(4.0))) //f2 already knows about q!
实现这一目标的最佳技巧是什么?我可以在案例类扩展的特征中定义我的函数吗?
编辑:真实世界的应用程序有7个成员,而不是3.只有少数功能需要访问成员。大多数功能都不关心它们。
答案 0 :(得分:5)
如果q
中的f2
总是引用您q
中的case class
,那么就快速破解:
trait TraitA {
def q:Double
def r:Double
def s:Double
def f1(w:Double) = (d:Double) => math.sin(d) * w
def f2(w:Double) = (d:Double) => d * q * w
}
case class A(q:Double, r:Double, s:Double, l:List[(Double)=>Double]=Nil) extends TraitA
val a=new A(0.5, 1.0, 2.0){override val l= List(f1(3.0), f2(4.0))}
答案 1 :(得分:3)
有明显的val声明:
val a = 0.5
A(a, 1.0, 2.0, List(f1(3.0), f2(4.0, a)))
否则,f2
需要对A的this
的引用,如果它是A类的成员或A的特定实例,它将具有。部分问题是函数已完全烘焙在实例化A的实例之前。因此,您必须在A的上下文中定义f2
,而不是简单地实例化它。
最后,您可以使功能部分功能。第一组参数将保持原样,但第二组将添加A类。
答案 2 :(得分:1)
一个简单的想法是更改函数以获取带有3个双精度(q,r和s)的函数列表,并将函数从double返回到double。这样那些需要任何值的函数都可以使用它们,而其他函数则只是忽略它们。