2

これを読んでもunapply()、返品についてまだ疑問がありますBoolean

Scala Programming Book (第 2 版) の 602 ページをご覧ください。例があります:

case Email(Twice(x @ UpperCase()), domain) => ...

UpperCase は、return を持ち、持たないオブジェクトとして定義されてunapply()Booleanます。apply()

object UpperCase {
 def unapply(s:String): Boolean = s.toUpperCase == s
}

このようなものはどこTwiceにありますか:

object Twice {
 def apply(s:String): String = s + s
 ...

質問は次のとおりです(多すぎるに違いありません、申し訳ありません):

ここで UpperCase().unapply(..) はどのように機能しますか?

を渡すDIDI@hotmail.comと、x最初のコード snippet = 'DI'.. で '@' .. を使用して 'x' をバインドし、それを に渡してie (?)UpperCase.unapplyを呼び出します。unapply(x)unapply('DIDI')True

しかし、なぜOptionですか?unapply私はそれが戻ると思う傾向がありますOption..それがどのように機能するかのようなものです。これはおそらく、通常はOption一部のデータをラップするためですが、単純なケースでは、ブール値をラップするべきではありませんか? そして、apply() がないからですか?

Boolean/を使用する場合の違いは何Optionですか? この例に基づいています。

そして、この構文: x @ UpperCase()、特定の 1 つの内部で一致している場合、構文を置き換えることになっていvalue match caseますか (そのように読むと思いますか? case) これを行う統一された方法/構文とは思えません。

通常、次のような構文 (x,y が Int であると仮定):case AA(x @ myX, y) => println("myX: " + myX)は、xにバインドすることを示します。この場合myX、基本的にmyXは .. のエイリアスです。xしかし、私たちの場合 - x @ UpperCase(). .. にxバインドし、パラメーターとして配置します。つまり、ここでのバインドは非常に抽象的/幅広い概念です..UpperCase().unapply()x

4

2 に答える 2

6

これは簡単です:

1) Booleanを返す場合、 unapply は一致するクエリをテストするだけです

scala> object UpperCase {
     | def unapply(s: String) = s.toUpperCase == s
     | }
defined module UpperCase

scala> "foo" match {
     | case UpperCase() => true
     | case _ => false
     | }
res9: Boolean = false

2) Option[T]を返す場合、T をアンラップするエクストラクタを作成します。

scala> object IsUpperCase {
     | def unapply(s: String) = Option(s).map(x => x.toUpperCase == x)
     | }
defined module IsUpperCase

scala> "FOO" match {case IsUpperCase(flag) => flag}
res0: Boolean = true
于 2013-09-11T14:30:24.400 に答える