Scala 3.7的asType匹配代码在3.3.6 LTS中的替代方案咨询
Scala 3.3.6 替代 Scala 3.7 类型匹配代码的实现
原Scala 3.7代码用于在宏中检查目标类型是否为S的子类型,匹配成功后生成apply[t]表达式,否则抛出错误。在Scala 3.3.6中可通过以下方式替代实现:
import scala.quoted.* def macroImpl[S: Type](x: TypeRepr)(using Quotes): Expr[Any] = { val sType = TypeRepr.of[S] if x <:< sType then x.asType match case '[t] => '{ apply[t] }.asExprOf[Any] else quotes.report.errorAndAbort( s"Expected $x to be a sub-type of $sType", quotes.reflect.Position.ofMacroExpansion ) }
关键差异说明
- Scala 3.3.6不支持
'[type t <: S; t]这种带类型约束的模式匹配语法,需先通过x <:< sType手动执行子类型检查 - 检查通过后,再通过
x.asType匹配出具体类型t,后续生成表达式的逻辑与原代码一致 - 宏上下文的
report和Position需通过quotes实例访问,要确保隐式Quotes参数存在
内容的提问来源于stack exchange,提问作者Andriy Plokhotnyuk
相关产品推荐
相关产品推荐

