地図:サイレント一致していない要素を捨てます。これらは、私は残念ながら
val b = a map (((x, y), u) => ((y, x), u)))
のように表現するために期待されるセマンティクスは、Scalaではこれらのセマンティクスを達成するために何の簡潔な構文はありません。 は代わりに、あなた自身をdestructureする必要があります:
val b = a map { p => ((p._1._2, p._1._1), p._2) }
一つは、非構造のために価値の定義を使用するように誘惑されることがあります。
val b = a map { p => val ((x,y), u) = p; ((y, x), u) }
しかし、このバージョンis no more safe than the one that uses explicit pattern matching。 (a
の定義は、その使用から遠く見える
val a: List[((Int, Int), Int)] = // ...
// ...
val b = a map { case ((x, y), u) => ((y, x), u) }
場合:あなたは安全な非構造セマンティクスをしたい場合は、このような理由から、最も簡潔な解決策は、明示的に意図しない拡大を防止し、明示的なパターンマッチングを使用するようにあなたのコレクションを入力することです
val b = (a: List[((Int, Int), Int)]) map { case ((x, y), u) => ((y, x), u) }
エクセレント:例えば、別のコンパイル単位で)、あなたは、マップの呼び出しでその型を帰することにより、リスクを最小限に抑えることができます。ありがとうございました。 – Owen
括弧のペアをスキップすることができます: 'b map {case 1 =>" one "; case 2 => "two"} ' –
これらの構文では、マッピングするコレクションを常に明示的に入力することをお勧めします。そうしないと、(タイプの推論やリファクタリングによる)静的型の意図しない広がりは、実行時まで検出されないタイプのエラーにつながる可能性があります:https://issues.scala-lang.org/browse/SI-4670 –