scala 禁用错误警告“可能缺少插补器”

h9vpoimq  于 2022-11-09  发布在  Scala
关注(0)|答案(5)|浏览(183)

我有一些嵌套的case类,对于特定的序列化机制,我需要提供一个包含$字符的productPrefix。就像这样

object Foo {
  case class Bar() {
    override def productPrefix = "Foo$Bar"
  }
}

现在,我收到一个编译器警告:

Warning:(53, 42) possible missing interpolator: detected interpolated identifier `$Bar`
    override def productPrefix: String = "Foo$Bar"

是否有办法禁用警告(如果可能的话,仅针对此示例)?Scala版本是2.11.8。

**编辑:**我只是觉得我很聪明:"Foo\u0024Bar"。但编译器甚至对此发出了警告。另一种解决方案是classOf[Bar].getName,假设没有更多的外部对象。

14ifxucb

14ifxucb1#

如果有一种方法可以将弦的各个部分组合在一起,你可以这样做。

override def productPrefix = "Foo$" + "Bar"

您还可以通过实际调用插值器,但转义$来关闭“Missing Interpolator”警告。

override def productPrefix = f"Foo$$Bar"
rseugnpd

rseugnpd2#

该警告由-Xlint引起。通过将scalac命令行选项指定为,可以禁用有关假定缺少的内插器的特定链接

-Xlint:_,-missing-interpolator

下划线(_)表示“一切”,-missing-interpolator表示“除了缺少插值器警告”。

oknwwptz

oknwwptz3#

如果在范围内发现变量,-Xlint会发出警告:

$ scala -Xlint
Welcome to Scala 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_101).
Type in expressions for evaluation. Or try :help.

scala> { val x = "hi" ; s"$x" }
res0: String = hi

scala> { val x = "hi" ; "$x" }
<console>:12: warning: possible missing interpolator: detected interpolated identifier `$x`
       { val x = "hi" ; "$x" }
                        ^
res1: String = $x

scala> { val y = "hi" ; "$x" }  // no warning if x is not a symbol
res2: String = $x

scala> object Foo { case class Bar() { override def productPrefix = "Foo$Bar" } }
<console>:11: warning: possible missing interpolator: detected interpolated identifier `$Bar`
       object Foo { case class Bar() { override def productPrefix = "Foo$Bar" } }
                                                                    ^
defined object Foo

通常,在插补时,使用双美元表示文字美元。(编辑:明确一点,$$类似于\$。)

scala> object Foo { case class Bar() { override def productPrefix = s"Foo$$Bar" } }
defined object Foo

scala> Foo.Bar().productPrefix
res8: String = Foo$Bar

使用f-内插器来获得一个常量字符串。

scala> def productPrefix = f"Foo$$Bar"
productPrefix: String

scala> :javap -pv -
[snip]
  public java.lang.String productPrefix();
    descriptor: ()Ljava/lang/String;
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: ldc           #16                 // String Foo$Bar
         2: areturn

您还可以将时髦的常量放在隔离范围内:

scala> :pa -raw
// Entering paste mode (ctrl-D to finish)

package k {
trait K { final val p = "Foo$Bar" }
}
package q {
  case class Bar() { override def productPrefix = (null: k.K).p }
}

// Exiting paste mode, now interpreting.

scala> q.Bar().productPrefix
res1: String = Foo$Bar

该常量是内联的。空引用的诀窍是避免任何分配,包括任何单例对象。

vtwuwzda

vtwuwzda4#

只有当词法作用域中存在具有该名称的标识符时,才会出现警告。如果林特在标识符是val/var时抱怨它,您只需将val/var重命名

ifmq2ha2

ifmq2ha25#

您可以将@nowarn注解放在定义上:

@nowarn("msg=possible missing interpolator")
override def productPrefix = "Foo$Bar"

“Missing Interpolator”警告通常很有用,所以我不会禁用它。

相关问题