使用 -Ywarn-unused 时从 Scala 中的分析中排除类型证据参数
Excluding type evidence parameters from analysis in Scala when using -Ywarn-unused
在 Scala 中编译包含类型证据参数的程序(例如 T <:< U
)可能会在将 -Ywarn-unused
传递给编译器时引起警告。特别是在类型证据参数用于验证使用幻像类型编码的约束的情况下,很可能会出现此警告。
这里编译文件为例:
https://github.com/hseeberger/demo-phantom-types/blob/master/src/main/scala/de/heikoseeberger/demophantomtypes/Hacker.scala returns 以下内容:
# 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
这个参数在运行时其实不是必须的,但是这个参数在编译时很有用。有什么方法可以指示编译器忽略这种情况,同时仍然在其他上下文中对未使用的函数参数发出警告?
例如,我认为指示编译器忽略 class <:<
或 =:=
的隐式参数可以解决此问题,但我不确定如何实现.
我经常发现自己添加这个是因为 -Ywarn-unused
或 -Ywarn-value-discard
:
package myproject
package object syntax {
implicit class IdOps[A](a: A) {
def unused: Unit = ()
}
}
允许您在代码中执行 ev.unused
以明确 "specify" 该值不会被使用或仅用于副作用。您 没有在定义中使用 class 字段,但是 -Ywarn-unused
.
没问题
您的另一个选择是使用 silencer 插件来抑制对这几种方法的警告。
许多年后,值得一提的是 @unused
注释可用(从什么时候开始,我不确定):
import scala.annotation.unused
def drinkCoffee(implicit @unused ev: IsDecaffeinated[S]): Hacker[State.Caffeinated]
因此,您不能使用上下文边界
在 Scala 中编译包含类型证据参数的程序(例如 T <:< U
)可能会在将 -Ywarn-unused
传递给编译器时引起警告。特别是在类型证据参数用于验证使用幻像类型编码的约束的情况下,很可能会出现此警告。
这里编译文件为例: https://github.com/hseeberger/demo-phantom-types/blob/master/src/main/scala/de/heikoseeberger/demophantomtypes/Hacker.scala returns 以下内容:
# 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
这个参数在运行时其实不是必须的,但是这个参数在编译时很有用。有什么方法可以指示编译器忽略这种情况,同时仍然在其他上下文中对未使用的函数参数发出警告?
例如,我认为指示编译器忽略 class <:<
或 =:=
的隐式参数可以解决此问题,但我不确定如何实现.
我经常发现自己添加这个是因为 -Ywarn-unused
或 -Ywarn-value-discard
:
package myproject
package object syntax {
implicit class IdOps[A](a: A) {
def unused: Unit = ()
}
}
允许您在代码中执行 ev.unused
以明确 "specify" 该值不会被使用或仅用于副作用。您 没有在定义中使用 class 字段,但是 -Ywarn-unused
.
您的另一个选择是使用 silencer 插件来抑制对这几种方法的警告。
许多年后,值得一提的是 @unused
注释可用(从什么时候开始,我不确定):
import scala.annotation.unused
def drinkCoffee(implicit @unused ev: IsDecaffeinated[S]): Hacker[State.Caffeinated]
因此,您不能使用上下文边界