-Xlint
warnt, wenn es einen var in Rahmen sieht:
$ 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
Normalerweise verwenden Doppel Dollar für wörtliche Dollar, wenn interpoliert werden. (Edit: klar zu sein, ist $$
wie \$
.)
scala> object Foo { case class Bar() { override def productPrefix = s"Foo$$Bar" } }
defined object Foo
scala> Foo.Bar().productPrefix
res8: String = Foo$Bar
Verwenden Sie f-Interpolator ein konstantes String zu erhalten.
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
Sie können auch Ihre flippige Konstanten in einem unter Quarantäne Rahmen setzen:
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
Die Konstante inlined wird. Der Trick der Nullreferenz vermeidet jegliche Zuweisungen, einschließlich eines Singleton-Objekts.
'-Xlint: -missing-interpolator, _' –
@ som-snytt Ah! Richtig, ich hatte '-Xlint' nicht aktiviert für mein anderes Projekt (das ist voll von diesen Strings), also war ich überrascht, die Warnung zum ersten Mal zu sehen. In diesem neuen Projekt hatte ich 'Xlint' aktiviert. –