准引号

模式详情

语言
此文档页面专门针对 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 @ _))

此页面的贡献者