scala中的部分函数是否有类似Map.keySet的内容?

scala中的部分函数是否有类似Map.keySet的内容?,scala,dictionary,partialfunction,Scala,Dictionary,Partialfunction,更具体地说,我有: 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) } d

更具体地说,我有:

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)
  }
}
当然,这有点简化,但是报告功能是必需的

一些历史记录:我首先使用
Map
实现它,但后来我将其更改为
PartialFunction
,以支持以下
覆盖def myMap:MethodMap=if(one)map1 else map2


任何重构我的代码以支持一切的建议都将受到欢迎。

否。
部分函数可以在无限集上定义(通常是)。例如,在这些情况下,您希望
报告
返回什么:

class concrete2 extends abstr {
  def myMap = { case Key(_) => ??? }
}

??如果您有一个感兴趣的值的有限列表,您可以这样做

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)
  }
}

当然,域不是类型的一部分。

否。
PartialFunction
可以在无限集上定义(通常是)。例如,在这些情况下,您希望
报告
返回什么:

class concrete2 extends abstr {
  def myMap = { case Key(_) => ??? }
}

??如果您有一个感兴趣的值的有限列表,您可以这样做

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)
  }
}

当然,域不是该类型的一部分。

在您的解决方案中,是否有任何方法将部分函数的域定义为有限集
,而不是更一般的类型
?并且该
if
将与
映射
同样有效(当然,您需要在任何地方使用相同的类型)。编辑以回答您的第二条评论。在您的解决方案中,是否有任何方法将分部函数的域定义为有限集
,而不是更一般的类型
?并且此
if
将同样适用于
映射
(当然,您需要在任何地方使用相同的类型)。编辑以回答您的第二条评论。
def f: MethodMap = { case key if keys.contains(key) => ... }