scala中的部分函数有类似Map.keySet的东西吗



更具体地说,我有:

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

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

相关内容

  • 没有找到相关文章

最新更新