从头等功能访问类成员

时间:2010-05-18 19:03:05

标签: oop scala scala-2.8 first-class-functions

我有一个案例类,它包含一系列函数:

case class A(q:Double, r:Double, s:Double, l:List[(Double)=>Double])

我定义了20多个函数。其中一些函数有自己的参数,其中一些还使用案例类中的qrs值。两个例子是:

def f1(w:Double) = (d:Double) => math.sin(d) * w
def f2(w:Double, q:Double) = (d:Double) => d * q * w

问题是我在实例化案例类时需要引用qrs两次:

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.只有少数功能需要访问成员。大多数功能都不关心它们。

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。这样那些需要任何值的函数都可以使用它们,而其他函数则只是忽略它们。