-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
Обычно используют двойной доллар для буквального доллара, когда интерполирования. (Edit: быть ясно, $$
, как \$
.)
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
Константы встраиваемая. Трюк нулевой ссылки позволяет избежать любых распределений, включая любой одноэлементный объект.
'-Xlint: -использование-интерполятор, _' –
@ som-snytt Ах! Правильно, у меня не было включено -Xlint для моего другого проекта (который заполнен этими строками), поэтому я был удивлен, увидев предупреждение в первый раз. В этом новом проекте я включил '-Xlint'. –