2015-05-17 10 views
7

Podczas kompilacji po fragmencie kodu:Dlaczego Scala wymyka się spacjom w nazwach metod?

class MyTest { 

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

    } 
} 

Metoda test test jest oddany do kodu bajtowego jak test$u0020test.

Dlaczego tak się dzieje i jak można to wyłączyć?

Przestrzeń jest poprawnym identyfikatorem nazwy metody zgodnie ze specyfikacją JVM. Ponadto, nie ma wzmianki o takim kodowaniu w specyfikacji języka Scala. Co więcej, inne języki JVM, takie jak Groovy i Spice Framework oparte na Groovy, nie kodują spacji.

Dlaczego potrzebuję tego: przyjazne dla ludzi nazwy JUnit i raporty z testów.

Java 1.8.0_45, Scala 2.11.6

+2

Myślę, że jedynym powodem jest jednolitość. Prawdopodobnie nie chciały w specjalnym przypadku klasy postaci, które nie są poprawnymi identyfikatorami. Technicznie też nie widzę potrzeby. –

+1

Jestem pewna, dlaczego spodziewałbyś się znaleźć to w specyfikacji językowej; jest to specyfikacja * języka *, a nie implementacja kompilatora, prawda? –

Odpowiedz

2

Spójrz na https://github.com/sbt/junit-interface

-s Spróbuj rozszyfrować nazwy Scala w ślady stosu i nazw testowych. Cofnij się cicho do nieodszyfrowanych nazw, jeśli żadna pasująca biblioteka Scali nie znajduje się na ścieżce klasy.

Można więc powiedzieć

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

w build.sbt pliku, a następnie za pomocą metody

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

wynik testu wskazuje

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

nie

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

Nie byłoby wymagalne z Java inaczej. Interoperacyjność z Javą była ważnym czynnikiem przy projektowaniu Scala.

OTOH, doświadczenie pokazało, że najlepiej jest trzymać się nazw Javy w takich przypadkach.

+1

$ wydaje się być poprawnym identyfikatorem java: http://stackoverflow.com/questions/7484210/what-is-the-meaning-of-in-a-vargeble-name – Siphor

+1

Bardzo łatwo jest napisać kod Scala, który nie jest " t można wywoływać z Javy (na przykład nazwa metody "const"). Nie jestem pewien, czy jestem w 100% przekonany przez to wyjaśnienie. –

Powiązane problemy