在scala中是否存在类似Map.keySet的部分函数?

时间:2015-12-05 10:11:47

标签: 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)
  }

  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 个答案:

答案 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) => ... }

当然,域名不属于该类型。