0

より具体的には、私は持っています:

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に変更しました。PartialFunctionoverride def myMap: MethodMap = if (one) map1 else map2

すべてをサポートするためにコードをリファクタリングするという提案も大歓迎です。

4

1 に答える 1

3

No.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 を使用して実装しましたが、2 番目の部分の最後の行をサポートするために PartialFunction に変更しました。

なんで?これは と同様に機能しMapます。

あなたのソリューションでは、部分関数のドメインを有限集合に定義する方法はありますかkeys

def f: MethodMap = { case key if keys.contains(key) => ... }

もちろん、ドメインは型の一部ではありません。

于 2015-12-05T10:47:57.847 に答える