从头等功能访问类成员

dby*_*rne 3 oop scala first-class-functions scala-2.8

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

case class A(q:Double, r:Double, s:Double, l:List[(Double)=>Double])
Run Code Online (Sandbox Code Playgroud)

我定义了20多个函数.其中的一些功能都有自己的参数,其中一些还可以使用q,rs值从案例类.两个例子是:

def f1(w:Double) = (d:Double) => math.sin(d) * w
def f2(w:Double, q:Double) = (d:Double) => d * q * w
Run Code Online (Sandbox Code Playgroud)

问题是,然后我需要引用q,rs实例的情况下上课的时候两次:

A(0.5, 1.0, 2.0, List(f1(3.0), f2(4.0, 0.5))) //0.5 is referenced twice
Run Code Online (Sandbox Code Playgroud)

我希望能够像这样实例化这个类:

A(0.5, 1.0, 2.0, List(f1(3.0), f2(4.0))) //f2 already knows about q!
Run Code Online (Sandbox Code Playgroud)

实现这一目标的最佳技术是什么?我可以在案例类扩展的特征中定义我的函数吗?

编辑:真实世界的应用程序有7个成员,而不是3.只有少数功能需要访问成员.大多数功能都不关心它们.

Pat*_*ick 5

如果qin f2 总是qcase 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))}                                   
Run Code Online (Sandbox Code Playgroud)