更具体地说,我有:
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
实现了它,但之后我将其更改为PartialFunction
以支持以下override def myMap: MethodMap = if (one) map1 else map2
。
任何重构我的代码以支持所有内容的建议也值得赞赏。
答案 0 :(得分:3)
没有。 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
一样适用。
在你的解决方案中,有没有办法将partial函数的域定义为有限集
keys
def f: MethodMap = { case key if keys.contains(key) => ... }
当然,域名不属于该类型。