Есть ли что-то вроде 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) => ... }

Конечно, домен не является частью типа.

Другие вопросы по тегам