4

次のように定義されたextractという名前の関数を作成しました。

def extract(params: String): Seq[String] = {
  val result = params.split(",") map (param => param.trim())
  result toSeq
}

次に、次のように、抽出結果に対してパターン マッチングを実行します。

extract(myInputString) match {
  case Nil => // do something
  case head :: Nil => // do something
  case head :: tail => // do something
}

パターンがcase Nil =>ブランチに一致するたびに、

scala.MatchError: WrappedArray(T) (of class scala.collection.mutable.WrappedArray$ofRef)

一方、抽出関数で結果 toSeqSeq(result:_*)に置き換えると、すべて正常に動作します。

誰でもこの動作を説明できますか?

4

3 に答える 3

4

Nilおよび::は、 type のインスタンスのみに一致するエクストラクターですList。これはSeq、 である場合とそうでない場合がある、より一般的な特性ですList

Sequsingを構築するSeq(...)と、Scala はListデフォルトで を構築します。同じことはtoSeq、通常、基になるコレクションを最も適切なSeqインターフェイスにカプセル化する については言えません。たとえば、は をIterator.toSeq生成しますが、Streamは をArray.toSeq生成しWrappedArrayます。

toSeq;を呼び出したときにコードが機能しないのはそのためです。(元の Javaクラスのメソッドです) をString.split生成し、その型を維持します。ケースを追加して のインスタンスを処理するか、メソッドが を返すようにすることができます。ArrayStringmapSeqextractList

于 2012-12-23T23:02:43.170 に答える
2

一般的なSeqs の場合、次のように一致を行います。

extract(myInputString) match { 
  case Seq() => ...
  case Seq(head) => ...
  case Seq(head, tail @ _*) => ...
}

Scala 2.10 には のエクストラクターとSeq同等のものがあるため、とをList置き換えるだけで機能します。NilSeq()::+:

extract(myInputString) match {
  case Seq() => ...
  case head +: Seq() => ...
  case head +: tail => ...
}
于 2012-12-24T09:36:12.707 に答える
0

さあ、アルティメットマッチ

extract("a, b") match { 
  case Seq() => "0"
  case Seq(a, b, _*) => "many"
  case Seq(a, _*) => "1"
}

そして、ここでも少し疑念があります。すべてがListここにあります。

...

toList、またはあなたのバリアントがSeq(someething: _*)再び作成されますList

于 2012-12-23T22:57:40.243 に答える