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,r和s值从案例类.两个例子是:
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,r和s实例的情况下上课的时候两次:
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.只有少数功能需要访问成员.大多数功能都不关心它们.
如果qin 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))}
Run Code Online (Sandbox Code Playgroud)