1

unapply整数のチェックが10未満であるという単純なものがあります

object MatchLess {
    def unapply(i: Int): Option[Int] = if ( i < 10 ) Some(i) else None
}

// so this prints
// 7 8 9 . . .
for ( i <- 7 to 12 ) i match {
    case MatchLess(x) => print(x + " ") // line 8
    case _ => print(". ")
}

unapply構文について疑問が1つありますcase。8行目で、値xが実際に両側に表示されているのは=>なぜですか。コンパイラがこのような割り当てを暗黙的に追加すると想定できますか?

// ...
case /* val x = i */ MatchLess(x) => print(x + " ") // line 8
4

2 に答える 2

7

case MatchLess(x) => ...意味を書くと以下のようになります。

  1. unapply メソッドを実行する
  2. 成功した場合、変数 (here ) をhere ofxによって返された値にバインドします (そうでなければ、パターンが一致しません。次へ進みます。unapplyiSome(i)

したがって、特定のケースxは、 は と同じ値にバインドされますiSome(i)しかし、関数MatchLess.unapplyが何か他のもの (例えば) を返す代わりに、 Some(42)x は にバインドされていたでしょう42

于 2012-07-27T06:13:04.327 に答える
2

パターンマッチングに関する言語仕様のセクション8を確認してください。

Syntax:
Pattern ::= Pattern1 { ‘|’ Pattern1 }
Pattern1 ::= varid ‘:’ TypePat
| ‘_’ ‘:’ TypePat
| Pattern2
Pattern2 ::= varid [‘@’ Pattern3]
| Pattern3
Pattern3 ::= SimplePattern
| SimplePattern {id [nl] SimplePattern}
SimplePattern ::= ‘_’
| varid                                                 // <- 2)
| Literal
| StableId
| StableId ‘(’ [Patterns] ‘)’                           // <- 1)
| StableId ‘(’ [Patterns ‘,’] [varid ‘@’] ‘_’ ‘*’ ‘)’
| ‘(’ [Patterns] ‘)’
| XmlPattern
Patterns ::= Pattern {‘,’ Patterns}

MatchLess(x)SimplePattern(1)として識別され、括弧内の式は、上記に従って、パターン->パターン->パターン1->パターン2->パターン3-> SimplePattern-> varid(2)によって識別されます。この可変パターンは次のように記述されます。

可変パターンxは、小文字で始まる単純な識別子です。これは任意の値と一致し、変数名をその値にバインドします。xのタイプは、外部から与えられたパターンの予想されるタイプです。

あなたの例でunapplyは、はで呼び出されi結果はにバインドされxます。

于 2012-07-27T06:15:10.827 に答える