これは機能します:
new ~("a", new ~("b", 25)) match {
case "a" ~ ("b" ~ 25) =>
}
したがって、最初の句と同じように括弧を配置する必要があります。それ以外の場合、チルダは左結合であるため、パターンのタイプが異なり、コンパイルされません。
case "a" ~ "b" ~ 25
と同じです
case ("a" ~ "b") ~ 25
あなたの場合、これは間違っているでしょう。
付録
クラス/メソッド名の最後の文字としてコロンを使用することで、右結合性を得ることができます。以下は、括弧なしでコンパイルおよび一致します(new
コンパイラが混乱することはもうないので、を削除できます$tilde$colon
)。
case class ~:[a,b](_1:a, _2:b)
~:("a", ~:("b", 25)) match {
case "a" ~: "b" ~: 25 =>
}
反応
1)new
キーワードがない場合、引数のビット単位の否定を与えるcase class ~
によってシャドウイングされます。unary_~
likeの式~ 2
は内部で評価されunary_~(2)
、の場合も同じ~ ("a", 1)
です。ただしunary_~
、そのタプルで定義しない限り、エラーが発生します。new
キーワードを使用して、その名前のクラスを明示的に探すようにコンパイラーにアドバイスします。これにより、混乱することはありません。$tilde("a", 1)
(技術的には、の内部名であるwhichを使用してこれを回避できますcase class ~
が、これはコンパイラの詳細であるため、おそらくこれに依存しないでください。)
2&3)右結合性は、Scala言語仕様で参照されています。セクション「中置操作」</p>
演算子の結合性は、演算子の最後の文字によって決まります。コロン「:」で終わる演算子は右結合です。他のすべての演算子は左結合です。
ちなみに、右結合性は、を使用してリストを作成できるようにするためのトリックですNil
。(Nil
は空List
であり、右結合連結演算子が::
定義されています。)
val l: List[Int] = 1 :: 2 :: 3 :: Nil
これは次のように評価されます
val l: List[Int] = (1 :: (2 :: (3 :: Nil)))
または、より正確には、3 :: Nil
≡なのでNil.::(3)
、
val l: List[Int] = ( ( Nil.::(3) ).::(2) ).::(1)