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