更具体地说,我有:
case class Key (key: String)
abstract class abstr {
type MethodMap = PartialFunction[Key, String => Unit]
def myMap: MethodMap // abstract
def useIt (key: Key, value: String) = {
val meth = myMap(key)
meth(value)
}
def report = {
for (key <- myMap.keySet) // how to do this
println("I support "+key)
}
}
我是这样使用的:
class concrete extends abstr {
var one: Boolean
def method1(v: String): Unit = ???
def method2(v: String): Unit = ???
def map1: MethodMap = {
case Key("AAA") => method1
}
def map2: MethodMap = {
case Key("AAA") => method2
}
override def myMap: MethodMap = if (one) map1 else map2
}
当然,这在一定程度上被简化了,但报告功能是必要的。
一些历史:我最初使用Map
实现它,但后来为了支持下面的override def myMap: MethodMap = if (one) map1 else map2
,我将它更改为PartialFunction
。
任何重构我的代码以支持一切的建议也将受到赞赏。
否。PartialFunction
可以定义(并且通常是)在无限集上。例如,在这些情况下,您希望report
返回什么:
class concrete2 extends abstr {
def myMap = { case Key(_) => ??? }
}
或
class concrete2 extends abstr {
def myMap = { case Key(key) if key.length > 3 => ??? }
}
如果你有一个有限的值列表,你感兴趣,你可以做
abstract class abstr {
type MethodMap = PartialFunction[Key, String => Unit]
def myMap: MethodMap // abstract
val keys: Seq[Key] = ...
def report = {
for (key <- keys if myMap.isDefined(key))
println("I support "+key)
}
}
一些历史:我最初使用Map实现它,但后来为了支持第二部分的最后一行,我将它改为PartialFunction。
为什么?这与Map
同样适用。
在您的解决方案中,有没有任何方法可以将偏函数的域定义为有限集
keys
def f: MethodMap = { case key if keys.contains(key) => ... }
当然,域不是类型的一部分。