我正在创建一个简单的缓存特征(轻松缓存我的函数):
trait Cache[A,B] {
def _calc(v:A):B
private var cache = Map[A,B]()
def calc(v:A):B = {
cache.get(v) match {
case Some(x) => x
case None =>
val x = _calc(v)
cache += (v -> x)
x
}
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
object Sol extends Cache[Int,Int] {
def _calc(v:Int):Int = { /* do something here */ }
}
Sol.calc(5)
Run Code Online (Sandbox Code Playgroud)
它工作正常,但问题出现在我需要缓存具有更多参数的函数时 - 所以我需要开发特征Cache2,Cache3,来自第一个特征的所有复制粘贴代码.
可能的解决方法是将具有多个参数的函数转换为接受元组的函数,但这似乎不正确.
有没有办法更普遍地做到并避免干扰原则违规?
add您至少可以自动元组您的函数,以便您可以定义接受常用参数列表的实际函数(例如):
object Add extends Cache[(Int, Int),Int]{
def add (a:Int,b:Int):Int = a+b
def _calc(t:(Int, Int)) = add _ tupled t
}
Run Code Online (Sandbox Code Playgroud)
通过调用它Add.calc(3, 5)
编辑:或者使用这种方式来实现 Cache2 ... CacheN 而无需重复整个 Cache 代码。
trait Cache2[A, B, C] extends Cache [(A,B), C] {
def _calc2(a: A, b: B):C
def _calc(t:(A,B)) = _calc2 _ tupled t
}
Run Code Online (Sandbox Code Playgroud)
然后再次
object Add2 extends Cache2[Int,Int,Int] {
def _calc2(a:Int, b:Int) = a+b
}
Run Code Online (Sandbox Code Playgroud)
和Add2.calc(3, 5)
| 归档时间: |
|
| 查看次数: |
691 次 |
| 最近记录: |