Есть ли что-то вроде Map.keySet для частичной функции в Scala?
Конкретнее у меня есть:
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
,
Любое предложение реорганизовать мой код для поддержки всего также приветствуется.
1 ответ
Нет. 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) => ... }
Конечно, домен не является частью типа.