在 Scala 中编译包含类型证据参数的程序(例如 T <:< U
)会在 -Ywarn-unused
时引起警告传递给编译器。特别是在类型证据参数用于验证使用幻像类型编码的约束的情况下,很可能会出现此警告。
举个例子,在这里编译文件: https://github.com/hseeberger/demo-phantom-types/blob/master/src/main/scala/de/heikoseeberger/demophantomtypes/Hacker.scala返回以下内容:
# scalac -Ywarn-unused Hacker.scala
Hacker.scala:42: warning: parameter value ev in method hackOn is never used
def hackOn(implicit ev: IsCaffeinated[S]): Hacker[State.Decaffeinated] = {
^
Hacker.scala:47: warning: parameter value ev in method drinkCoffee is never used
def drinkCoffee(implicit ev: IsDecaffeinated[S]): Hacker[State.Caffeinated] = {
^
two warnings found
我很清楚参数 ev
在运行时实际上不是必需的,但该参数在编译时很有用。有什么方法可以指示编译器忽略这种情况,同时仍然在其他上下文中对未使用的函数参数发出警告?
例如,我认为指示编译器忽略类 <:<
的隐式参数或 =:=
会解决这个问题,但我不确定如何实现。
最佳答案
我经常发现自己添加这个是因为 -Ywarn-unused
或 -Ywarn-value-discard
:
package myproject
package object syntax {
implicit class IdOps[A](a: A) {
def unused: Unit = ()
}
}
允许您在代码中执行 ev.unused
以明确“指定”该值不会被使用或仅用于副作用。您没有在定义中使用类字段,但这对 -Ywarn-unused
没问题。
您的另一个选择是使用 silencer用于抑制这几种方法的警告的插件。
关于scala - 使用 -Ywarn-unused 时从 Scala 中的分析中排除类型证据参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46128561/