禁用错误警告 "possible missing interpolator"
Disable false warning "possible missing interpolator"
我有一些嵌套案例 类,对于特定的序列化机制,我需要提供包含 $
个字符的 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
,考虑到没有更多外部对象的约束。
-Xlint
如果在范围内看到 var 会发出警告:
$ 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-interpolator 得到常量字符串。
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
常量是内联的。空引用的技巧避免了任何分配,包括任何单例对象。
如果有办法从字符串的各个部分组成字符串,您可以这样做。
override def productPrefix = "Foo$" + "Bar"
您也可以通过实际调用插值器来消除 "missing interpolator" 警告,但转义 $
.
override def productPrefix = f"Foo$$Bar"
警告是由-Xlint
引起的。可以通过将 scalac
命令行选项指定为
来禁用关于假定丢失的插值器的特定 linter
-Xlint:_,-missing-interpolator
下划线 (_
) 代表 "everything" 而 -missing-interpolator
代表 "except the missing interpolator warning".
仅当词法范围内存在具有该名称的标识符时才会出现警告。
如果标识符是 val/var 时 linter 抱怨它,您可以重命名 val/var
我有一些嵌套案例 类,对于特定的序列化机制,我需要提供包含 $
个字符的 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
,考虑到没有更多外部对象的约束。
-Xlint
如果在范围内看到 var 会发出警告:
$ 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-interpolator 得到常量字符串。
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
常量是内联的。空引用的技巧避免了任何分配,包括任何单例对象。
如果有办法从字符串的各个部分组成字符串,您可以这样做。
override def productPrefix = "Foo$" + "Bar"
您也可以通过实际调用插值器来消除 "missing interpolator" 警告,但转义 $
.
override def productPrefix = f"Foo$$Bar"
警告是由-Xlint
引起的。可以通过将 scalac
命令行选项指定为
-Xlint:_,-missing-interpolator
下划线 (_
) 代表 "everything" 而 -missing-interpolator
代表 "except the missing interpolator warning".
仅当词法范围内存在具有该名称的标识符时才会出现警告。 如果标识符是 val/var 时 linter 抱怨它,您可以重命名 val/var