1

私は次のものを持っているとしましょう

case class IntWrap(value:Int)

次のように、2 つのケースから同じ変数を抽出したいと思います。

x match {
  case value:Int | IntWrap(value) => dosomethingwith(x)
  case _ => ???
}

しかし、私がこれを行うことができた唯一の方法は次のとおりです。

x match {
  case value:Int => dosomethingwith(x)
  case IntWrap(value) => dosomethingwith(x)
  case _ => ???
}

私の実際のケースでは、 dosomething は実際にはカプセル化するのがそれほど簡単ではない大きなコードブロックであるため、より良い方法はありますか?

4

3 に答える 3

2

x抽出された ではなく で何かをしたい場合はvalue、次のようにします。

case class IntWrap(value:Int) // extends T

def dosomethingwith(x: Any) = x

val x: Any = IntWrap(101)

x match {
  case _: Int | _: IntWrap => dosomethingwith(x)
  case _ => ???
}


抽出された値を実際に操作したい場合は、対応する一致ブロックを独自のエクストラクターに分解し、必要に応じて再利用できます。

x match {
  case Unwrap(value) => dosomethingwith(value)
  case _ => ???
}

object Unwrap {
  def unapply(x: Any) = x match {
    case x: Int => Some((x))
    case IntWrap(value) => Some((value))
    case _ => None
  }
}
于 2013-05-30T10:17:19.927 に答える
0

少し違う sth を思いつきましたが、重複を避けるのに役立つかもしれません:

  case class IntWrap(value: Int)
  implicit def intWrapToInt(intWrap: IntWrap) = intWrap.value

  def matchInt(x: AnyVal) = x match {
    case i: Int => println("int or intWrap")
    case _ => println("other")
  }

  //test
  matchInt(IntWrap(12))          //prints int or intWrap
  matchInt(12)                   //prints int or intWrap
  matchInt("abc")                //prints other

ただし、すべての参照で機能するわけではありません。ので注意してください。

于 2013-05-30T10:42:07.260 に答える