準引號

模式詳情

語言
此文件頁面專屬於 Scala 2 中發布的功能,這些功能已在 Scala 3 中移除或由替代方案取代。除非另有說明,此頁面中的所有程式碼範例都假設您使用的是 Scala 2。

Denys Shabalin 實驗性質

萬用字元模式

萬用字元模式 (pq"_") 是最簡單的模式,可符合任何輸入。

文字模式

字面模式等同於 AST 層級的字面表達式

scala> val equivalent = pq"1" equalsStructure q"1"
equivalent: Boolean = true

有關詳細資訊,請參閱 字面表達式 章節。

繫結模式

繫結模式是一種將模式或其部分命名為局部變數的方式

scala> val bindtup = pq"foo @ (1, 2)"
bindtup: universe.Bind = (foo @ scala.Tuple2(1, 2))

scala> val pq"$name @ $pat" = bindtup
name: universe.Name = foo
pat: universe.Tree = scala.Tuple2(1, 2)

沒有明確模式的繫結等同於具有萬用字元模式的繫結

scala> val pq"$name @ $pat" = pq"foo"
name: universe.Name = foo
pat: universe.Tree = _

請參閱 類型模式 以取得類型變數繫結範例。

萃取器模式

萃取器是一種將模式比對委派給另一個物件的 unapply 方法的簡潔方式

scala> val extractor = pq"Foo(1, 2, 3)"
extractor: universe.Tree = Foo(1, 2, 3)

scala> val pq"$id(..$pats)" = extractor
id: universe.Tree = Foo
pats: List[universe.Tree] = List(1, 2, 3)

類型模式

類型模式是一種檢查受檢項目的類型的方式

scala> val isT = pq"_: T"
isT: universe.Typed = (_: T)

scala> val pq"_: $tpt" = isT
tpt: universe.Tree = T

非萬用字元名稱和類型模式的組合表示為繫結到萬用字元類型模式

scala> val fooIsT = pq"foo: T"
fooIsT: universe.Bind = (foo @ (_: T))

scala> val pq"$name @ (_: $tpt)" = fooIsT
name: universe.Name = foo
tpt: universe.Tree = T

另一個要提的重要事項是類型變數模式

scala> val typevar = pq"_: F[t]"
typevar: universe.Typed = (_: F[(t @ <empty>)])

可以使用下列步驟建構(以及類似地解構)此類模式

scala> val name = TypeName("t")
scala> val empty = q""
scala> val t = pq"$name @ $empty"
scala> val tpt = tq"F[$t]"
scala> val typevar = pq"_: $tpt"
typevar: universe.Typed = (_: F[(t @ _)])

替代模式

模式替代表示一個模式,只要至少一個分支比對成功,該模式就會比對成功

scala> val alt = pq"Foo() | Bar() | Baz()"
alt: universe.Alternative = (Foo()| Bar()| Baz())

scala> val pq"$first | ..$rest" = alt
head: universe.Tree = Foo()
tail: List[universe.Tree] = List(Bar(), Baz())

scala> val pq"..$init | $last" = alt
init: List[universe.Tree] = List(Foo(), Bar())
last: universe.Tree = Baz()

元組模式

類似於 元組表達式元組類型,元組模式只是擴充為 TupleN 萃取器的語法糖

scala> val tup2pat = pq"(a, b)"
tup2pat: universe.Tree = scala.Tuple2((a @ _), (b @ _))

scala> val pq"(..$pats)" = tup2pat
pats: List[universe.Tree] = List((a @ _), (b @ _))

此頁面的貢獻者