2016-09-08 14 views
5

いくつかのネストされたケースクラスがあります。特定のシリアル化メカニズムについては、$文字を含むproductPrefixを用意する必要があります。そうfalse warning "interpolatorが見つからない可能性があります"

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であり、それ以上の外側の物体はないという制約がある。それはスコープでVARを見れば

+0

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

+0

@ som-snytt Ah!そうですね、私は他のプロジェクト(これらの文字列でいっぱいです)で '-Xlint'を有効にしていないので、初めて警告が表示されるのに驚きました。この新しいプロジェクトでは、私は '-Xlint'を有効にしました。 –

答えて

7

文字列を構成する方法がある場合は、このようなことができます。

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

また、実際に補間を呼び出すが、$をエスケープすることにより、「行方不明補間」の警告を黙らことができます。

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

あなたの他の答えはかなり巧妙だった。 –

+0

@ som-snytt、私は少し考え直さなければならなかった。私はこの答えにそれを組み入れました。 – jwvh

+0

しかしそれは間違っています。 $$についての私の答えを見てください。私はオブジェクトのBarにtoString = "Bar"があるので、 '' Foo $ Bar "'が動作することを意味しました。 –

4

-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 

定数がインライン化されます。 null参照のトリックは、シングルトンオブジェクトを含む任意の割り当てを回避します。

5

警告は-Xlintによって引き起こされます。おそらく不足して補間についての具体的なリンターは、アンダースコア(_

-Xlint:_,-missing-interpolator 

としてscalacコマンドラインオプションを与えることによって無効にすることができ、「すべて」のためであると-missing-interpolatorは「欠落補間の警告を除いて」のためです。

関連する問題