2
val i = Some(<foo/>)
<bar>{for(o <- i) yield o}</bar>

奇妙な値を返します:

res3: scala.xml.Elem = <bar>Some(&lt;foo/&gt;)</bar>

明らかに意図した結果ではありません。次のように書くことで回避できます。

<bar>{for(o <- i.toList) yield o}</bar>

意図した結果を返します。

<bar><foor></foo></bar>

しかし、なぜこの変換を行う必要があるのでしょうか? iList に変換する代わりに、キャストする必要がある特性はありますか?

4

2 に答える 2

4

Option.map(これは for-comprehension が使用するものです) が another を返し、 toまたは類似Optionの暗黙の変換がないためです (その理由は議論の余地があり、議論されています)。にはコレクションのようなメソッドがいくつかありますが、実際には主要なコレクションの特性を実装していないため、XML システムはそれを要素のコレクションとして扱うことを知りません。OptionSeqOption

ただし、barnesjd は、for-comprehension が必要ないことは正しいです。Option を List または Seq に変換してそのままにしておくことができるはずです。

scala> <bar>{i.toSeq}</bar>
res2: scala.xml.Elem = <bar><foo/></bar>
于 2013-10-01T21:39:04.393 に答える