2015-05-17 21 views
7

Khi biên dịch đoạn mã sau:Tại sao Scala thoát không gian trong tên phương thức?

class MyTest { 

    @org.junit.Test 
    def `test test`() { 

    } 
} 

Phương pháp test test đang được đưa vào bytecode như test$u0020test.

Tại sao điều đó xảy ra và làm thế nào điều này có thể bị vô hiệu hóa?

Dấu cách là số nhận dạng hợp lệ cho tên phương thức theo thông số JVM. Ngoài ra, không có đề cập đến mã hóa như vậy trong đặc tả ngôn ngữ Scala. Hơn nữa, các ngôn ngữ JVM khác như Groovy và Groovy dựa trên Spock Framework không mã hóa không gian.

Tại sao tôi cần điều này: Kiểm tra tên và báo cáo kiểm tra JUnit thân thiện với con người.

Java 1.8.0_45, Scala 2.11.6

+2

Tôi đoán lý do duy nhất cho điều này là tính đồng nhất. Họ có thể không muốn đặc biệt trường hợp các lớp nhân vật không phải là số nhận dạng hợp lệ. Về mặt kỹ thuật, tôi cũng không thấy cần thiết. –

+1

Tôi chắc chắn lý do tại sao bạn mong muốn tìm thấy điều này trong đặc tả ngôn ngữ; đó là một đặc điểm kỹ thuật của * ngôn ngữ *, không phải trình biên dịch, phải không? –

Trả lời

2

Nhìn vào https://github.com/sbt/junit-interface

-s Cố gắng giải mã tên Scala trong dấu vết ngăn xếp và tên thử nghiệm. Giảm âm thầm về các tên không được giải mã nếu không có thư viện Scala nào phù hợp trên đường dẫn lớp.

Vì vậy, chúng ta có thể nói

testOptions += Tests.Argument(TestFrameworks.JUnit, "-q", "-v", "-s") 

trong build.sbt tập tin, sau đó cho một phương pháp

def `get one hundred if fifty plus fifty started` {} 

kết quả thử nghiệm cho thấy

[info] Test ScalaTest.get one hundred if fifty plus fifty started 

không

[info] Test ScalaTest.get$u0020one$u0020hundred$u0020if$u0020fifty$u0020plus$u0020fifty started 
3

Nó sẽ không thể gọi được từ Java nếu không. Khả năng tương tác với Java là một cân nhắc quan trọng trong thiết kế của Scala.

OTOH, kinh nghiệm cho thấy tốt nhất là chỉ cần gắn vào tên Java trong những trường hợp như vậy.

+1

$ dường như là một số nhận dạng java hợp lệ: http://stackoverflow.com/questions/7484210/what-is-the-meaning-of-in-a-variable-name – Siphor

+1

Thật dễ dàng để viết mã Scala không phải là ' t có thể gọi được từ Java, mặc dù (ví dụ như một phương thức 'const'). Tôi không chắc mình bị thuyết phục 100% bởi lời giải thích này. –

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