unapply
Scala にとの両方があるのはなぜunapplySeq
ですか? 2つの違いは何ですか?いつどちらを優先する必要がありますか?
質問する
9227 次
3 に答える
39
詳細に立ち入り、少し単純化することなく:
通常のパラメーターのapply
構成とunapply
構造解除の場合:
object S {
def apply(a: A):S = ... // makes a S from an A
def unapply(s: S): Option[A] = ... // retrieve the A from the S
}
val s = S(a)
s match { case S(a) => a }
繰り返されるパラメーター、apply
構成、およびunapplySeq
構造解除の場合:
object M {
def apply(a: A*): M = ......... // makes a M from an As.
def unapplySeq(m: M): Option[Seq[A]] = ... // retrieve the As from the M
}
val m = M(a1, a2, a3)
m match { case M(a1, a2, a3) => ... }
m match { case M(a, as @ _*) => ... }
2 番目のケースでは、繰り返されるパラメータは のように扱われ、 と の間の類似性に注意してSeq
ください。A*
_*
したがって、さまざまな単一の値を自然に含むものを分解したい場合は、 を使用しますunapply
。を含むものを分解したい場合はSeq
、 を使用しますunapplySeq
。
于 2011-11-27T01:09:59.247 に答える
18
固定アリティと可変アリティ。 Scala でのパターン マッチング (pdf)では、ミラーリングの例を使用して説明しています。この回答にはミラーリングの例もあります。
簡単に言うと:
object Sorted {
def unapply(xs: Seq[Int]) =
if (xs == xs.sortWith(_ < _)) Some(xs) else None
}
object SortedSeq {
def unapplySeq(xs: Seq[Int]) =
if (xs == xs.sortWith(_ < _)) Some(xs) else None
}
scala> List(1,2,3,4) match { case Sorted(xs) => xs }
res0: Seq[Int] = List(1, 2, 3, 4)
scala> List(1,2,3,4) match { case SortedSeq(a, b, c, d) => List(a, b, c, d) }
res1: List[Int] = List(1, 2, 3, 4)
scala> List(1) match { case SortedSeq(a) => a }
res2: Int = 1
では、次の例ではどれが示されていると思いますか?
scala> List(1) match { case List(x) => x }
res3: Int = 1
于 2011-11-26T23:43:31.110 に答える
0
いくつかの例:
scala> val fruit = List("apples", "oranges", "pears")
fruit: List[String] = List(apples, oranges, pears)
scala> val List(a, b, c) = fruit
a: String = apples
b: String = oranges
c: String = pears
scala> val List(a, b, _*) = fruit
a: String = apples
b: String = oranges
scala> val List(a, _*) = fruit
a: String = apples
scala> val List(a,rest @ _*) = fruit
a: String = apples
rest: Seq[String] = List(oranges, pears)
scala> val a::b::c::Nil = fruit
a: String = apples
b: String = oranges
c: String = pears
scala> val a::b::rest = fruit
a: String = apples
b: String = oranges
rest: List[String] = List(pears)
scala> val a::rest = fruit
a: String = apples
rest: List[String] = List(oranges, pears)
于 2019-04-27T03:01:20.340 に答える