2016-09-08 19 views
5

Tôi có một số trường hợp lồng nhau và đối với một cơ chế tuần tự cụ thể, tôi cần cung cấp productPrefix có chứa $ ký tự. Giống như rấtVô hiệu hóa cảnh báo sai "có thể mất nội suy"

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

Bây giờ tôi nhận được một cảnh báo trình biên dịch từ này:

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

Có cách nào để vô hiệu hóa các cảnh báo, nếu có thể chỉ cho trường hợp này? Phiên bản Scala là 2.11.8.


Edit: Tôi chỉ nghĩ rằng tôi là thông minh: "Foo\u0024Bar". Nhưng trình biên dịch thậm chí còn cảnh báo về điều này. Một giải pháp khác là classOf[Bar].getName, với ràng buộc rằng không có đối tượng bên ngoài nào khác.

+0

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

+0

@ som-snytt Ah! Phải, tôi không có '-Xlint' được kích hoạt cho dự án khác của tôi (có đầy đủ các chuỗi này), vì vậy tôi đã ngạc nhiên khi thấy cảnh báo lần đầu tiên. Trong dự án mới này, tôi đã bật '-Xlint'. –

Trả lời

7

Nếu có cách để soạn chuỗi từ các phần của nó, bạn có thể làm một cái gì đó như thế này.

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

Bạn cũng có thể tắt tiếng cảnh báo "nội suy bị thiếu" bằng cách thực sự gọi nội suy, nhưng thoát khỏi $.

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

Câu trả lời khác của bạn khá thông minh. –

+0

@ som-snytt, tôi phải suy nghĩ lại một chút. Tôi đã kết hợp nó vào câu trả lời này. – jwvh

+0

Nhưng đó là sai. Xem câu trả lời của tôi về $$. Tôi có nghĩa là 's 'Foo $ Bar'' hoạt động vì đối tượng Bar có toString = "Bar". –

4

-Xlint cảnh báo nếu nó thấy một var trong phạm vi:

$ 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 

Thông thường, sử dụng đồng USD tăng gấp đôi đối với đô la đen khi nội suy. (Edit: để được rõ ràng, $$ là như \$.)

scala> object Foo { case class Bar() { override def productPrefix = s"Foo$$Bar" } } 
defined object Foo 

scala> Foo.Bar().productPrefix 
res8: String = Foo$Bar 

Sử dụng e-xen vào để có được một chuỗi liên tục.

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 

Bạn cũng có thể đặt hằng sôi nổi của bạn trong một phạm vi cách ly:

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 

Hằng được inlined. Bí quyết của tham chiếu null tránh bất kỳ phân bổ nào, bao gồm bất kỳ đối tượng singleton nào.

5

Cảnh báo được gây ra bởi -Xlint. Các Linter cụ thể về xen vào được cho là mất tích có thể được vô hiệu hóa bằng cách cho các tùy chọn dòng lệnh scalac như

-Xlint:_,-missing-interpolator 

các dấu gạch dưới (_) là dành cho "tất cả mọi thứ" và -missing-interpolator là dành cho "ngoại trừ cảnh báo xen vào thiếu".

Các vấn đề liên quan