2015-05-17 11 views
7

Quando si compila seguente frammento di codice:Perché Scala sfugge agli spazi nei nomi dei metodi?

class MyTest { 

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

    } 
} 

Metodo test test è stato messo in bytecode come test$u0020test.

Perché succede e come può essere disabilitato?

Lo spazio è un identificativo valido per il nome del metodo in base alle specifiche JVM. Inoltre, non vi è alcuna menzione di tale codifica nelle specifiche del linguaggio Scala. Inoltre, altri linguaggi JVM come Spock Framework basati su Groovy e Groovy non codificano spazi.

Perché ho bisogno di questo: nomi di test JUnit e rapporti di test a misura d'uomo.

Java 1.8.0_45, Scala 2.11.6

+2

Immagino che l'unica ragione di questo sia l'uniformità. Probabilmente non volevano casi speciali le classi di caratteri che non sono identificatori validi. Tecnicamente non vedo nemmeno una necessità. –

+1

Sono sicuro del motivo per cui ti aspetteresti di trovarlo nelle specifiche della lingua; è una specifica * del linguaggio *, non dell'implementazione del compilatore, giusto? –

risposta

2

Guarda https://github.com/sbt/junit-interface

-s Prova a decodificare i nomi Scala di tracce di stack e nomi di prova. Tornare indietro silenziosamente ai nomi non decodificati se nessuna libreria Scala corrispondente si trova sul percorso della classe.

Quindi possiamo dire

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

in build.sbt file, poi per un metodo

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

il risultato del test mostra

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

non

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

Non sarebbe richiamabile da Java altrimenti. L'interoperabilità con Java è stata una considerazione importante nella progettazione di Scala.

OTOH, l'esperienza ha dimostrato che è meglio attenersi ai nomi Java in questi casi.

+1

$ sembra essere un identificatore java valido: http://stackoverflow.com/questions/7484210/what-is-the-meaning-of-in-a-variable-name – Siphor

+1

È super facile scrivere codice Scala che non è t callable da Java, però (nominare un metodo 'const', per esempio). Non sono sicuro di essere al 100% convinto da questa spiegazione. –