2016-09-08 2 views
5

Ich habe einige geschachtelte Fallklassen und für einen bestimmten Serialisierungsmechanismus muss ich eine productPrefix angeben, die $ Zeichen enthält. Wie soFalsche Warnung deaktivieren "Möglicher fehlender Interpolator"

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

Jetzt bekomme ich eine Compiler-Warnung von diesem:

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

Gibt es eine Möglichkeit die Warnung, wenn möglich, nur für diese Instanz zu deaktivieren? Scala Version ist 2.11.8.


Edit: Ich dachte nur ich war clever: "Foo\u0024Bar". Aber der Compiler warnt sogar davor. Eine andere Lösung ist classOf[Bar].getName, vorausgesetzt, es gibt keine weiteren äußeren Objekte.

+0

'-Xlint: -missing-interpolator, _' –

+0

@ 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. –

Antwort

7

Wenn es eine Möglichkeit gibt, die Zeichenfolge aus ihren Teilen zu komponieren, könnten Sie so etwas tun.

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

Sie könnten auch die „fehlenden Interpolator“ Warnung ruhig durch tatsächlich den Interpolator aufrufen, aber die $ entkommen.

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

Ihre andere Antwort war ziemlich clever. –

+0

@ som-snytt, ich musste es ein wenig überdenken. Ich habe es in diese Antwort aufgenommen. – jwvh

+0

Aber das ist falsch. Siehe meine Antwort zu $$. Ich meinte, dass "Foo $ Bar" funktioniert, weil der Objektbalken toString = "Bar" hat. –

4

-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.

5

Die Warnung wird durch -Xlint induziert. Die spezifischen Linter über das angeblich fehlende Interpolator können, indem die scalac Befehlszeilenoption als

-Xlint:_,-missing-interpolator 

Der Unterstrich (_) ist für „alles“ deaktiviert werden und die -missing-interpolator ist für „außer der fehlenden Interpolator Warnung“.

Verwandte Themen