如何在Scala quasiquotes中消除未使用变量的编译警告?
解决方案
方法1:使用quasiquotes原生通配符(推荐)
quasiquotes模式中使用$_表示匹配该位置的任意语法树且不绑定变量,不需要改变匹配逻辑,也不会产生未使用警告:
accessor.tree match { case q"($_) => $rhs" => validate(rhs, hasSelect = false) case t => c.abort(c.enclosingPosition, s"Invalid function expression ${show(t)}") }
你之前直接在引号内写_的写法错误,是因为引号内的_会被解析为Scala语法树的字面下划线,而不是quasiquotes的匹配通配符。
方法2:给绑定变量加下划线前缀
如果后续可能需要用到该参数变量,可以给变量名加_前缀,Scala编译器默认不会对下划线开头的未使用变量告警:
accessor.tree match { case q"($_source) => $rhs" => validate(rhs, hasSelect = false) case t => c.abort(c.enclosingPosition, s"Invalid function expression ${show(t)}") }
方法3:使用告警抑制注解
Scala 2.13及以上版本可以直接在case分支加@nowarn注解抑制未使用告警,不需要修改原有匹配逻辑:
accessor.tree match { case q"($source) => $rhs" : @nowarn => validate(rhs, hasSelect = false) case t => c.abort(c.enclosingPosition, s"Invalid function expression ${show(t)}") }
内容的提问来源于stack exchange,提问作者steinybot
相关产品推荐
相关产品推荐

