2015-05-17 56 views
7

當編譯下面的代碼片段:爲什麼Scala在方法名稱中有空格?

class MyTest { 

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

    } 
} 

方法test test被投入字節碼test$u0020test

爲什麼發生這種情況,以及如何禁用?

根據JVM規範,空間是方法名稱的有效標識符。此外,在Scala語言規範中沒有提到這種編碼。此外,其他JVM語言(如Groovy和基於Groovy的Spock Framework)不會對空格進行編碼。

爲什麼我需要這個:人性化的JUnit測試名稱和測試報告。

的Java 1.8.0_45,斯卡拉2.11.6

+2

我想這是唯一的原因是一致性。他們可能不想特殊處理不是有效標識符的字符類。從技術上講,我也沒有看到必要的。 –

+1

我確定你爲什麼期望在語言規範中找到它;它是*語言*的規範,而不是編譯器實現,對嗎? –

回答

2

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

-s嘗試在堆棧跟蹤和測試名Scala的名稱進行解碼。如果沒有匹配的Scala庫位於類路徑上,則默默退回到未解碼的名稱。

所以我們可以說

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

build.sbt文件,那麼對於一個方法

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

的測試結果表明

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

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

它不會是從Java調用其他。與Java的互操作性是Scala設計中的一個重要考慮因素。

OTOH,經驗表明,最好在這種情況下堅持使用Java名稱。

+1

$似乎是一個有效的Java標識符:http://stackoverflow.com/questions/7484210/what-is-the-meaning-of-in-a-variable-name – Siphor

+1

這是超級簡單的編寫Scala代碼,但可以從Java中調用(例如,命名方法爲「const」)。我不確定我是否完全相信這個解釋。 –

相關問題