2012-11-29 142 views
8

我正在尋找一種C(++)#if 0類似的方式來評論Scala源代碼的全部內容,以便在實驗或過期的代碼中保留一段時間。在Scala中註釋掉部分代碼

我嘗試了兩種選擇,並希望聽到你使用什麼,如果你想出了更好的東西?

// Simply block-marking N lines by '//' is one way... 
// <tags> """ anything 

我的編輯器使這個很簡單,但它不是真正的東西。它很容易與實際的單行註釋混在一起。

後來我想通有原生XML支持,所以:在XML作品

<!-- 
    ... did not work 
--> 

包裝,除非你塊內有<tags>

class none { val a= <ignore> 
    ... 
    cannot have //<tags> <here> (not even in end-of-line comments!) 
</ignore> } 

同爲多行字符串似乎有種最好的,但是有很多樣板(Scala中不時髦)讓編譯器很高興(少一些,如果你是在一個類或一個對象中做這個):

object none { val ignore= """ This seems like 
    ... 
    <truly> <anything goes> but three "'s of course 
""" } 

'正確' 的方式做到這一點可能是:

/*** 
    /* 
    ... works but not properly syntax highlighed in SubEthaEdit (or StackOverflow) 
    */ 
***/ 

..但該/**/只,而不是即/******/匹配。這意味着塊內的評論需要平衡。而且 - SubEthaEdit當前的Scala語法突出顯示模式在此失敗了。

作爲比較,Lua具有--[==[匹配]==]等等。我覺得我被寵壞了?

所以 - 我有監督有一些有用的技巧嗎?

+1

我不知道爲什麼你需要支持'/ ***/* ... */*** /'嵌套式塊 –

+4

它可能會更好,只是刪除代碼,如果你想獲得它回到某個時候使用您的版本控制系統(或您的IDE中的本地歷史記錄)。一旦你熟悉它,並且更乾淨,它一樣快。評論是隨着時間的推移累積污漬的好方法,即使是最好的意圖,它也很少被清理乾淨。 –

+1

你能澄清一下你的用例嗎?你說「保持一段時間的實驗或過期代碼。」但不清楚爲什麼只使用/ * * /還不夠好。 正如其他人指出的,你想避免保留大量的代碼不被編譯,因爲你會有代碼腐爛的問題。因此,您可能需要考慮將文件/模塊/庫分離爲您目前未使用但可能在將來需要的代碼。 – markltbaker

回答

4

爲什麼不只是利用你的源代碼控制機制?保持代碼分離,將其作爲單獨的文件檢查並忘記。我不希望我的日常代碼庫混淆這類東西。

但請注意,如果您不經常使用此代碼(例如,在自動化測試等),它將受到code rot的影響。只要您註釋掉或以其他方式擱置了這些內容,依賴關係就會繼續,您會發現不久之後它就不會與現有代碼庫相鏈接。

+0

是的,從長遠來看,這正是我採取的方法。整個源文件有一個「未使用」文件夾(可能會失效)。這是關於粒度,我猜。第一階段:評論出來。第二階段:未使用的文件夾。第三階段:從版本控制中刪除。最好的解決方案?修復我使用的Scala編輯器中的語法高亮顯示。最終解決方案:將檢查即將推出的Scala宏。 – akauppi

4

我修改了Scala模式的SyntaxDefinition.xml以支持/***...***/樣式註釋。

這與Scala語法分析器對嵌套/*...*/評論的支持不一樣,但我沒有找到一種方法來表達我的編輯器。

如果有人想這樣做同樣的,這裏有雲:

<!-- AK 30-Nov-2012 
- 
- The Scala parser handles nested '/*...*/' style comments, but the SEE 
- syntax highlighting seems not. 
- 
- We introduce '/***...***/' style comments (starting with three asterisks 
- since JavaDoc uses '/**..*/' style) and deeper levels, to be used for 
- blocking out code blocks, even if they contain '/*..*/' comments within. 
- 
- Note: Original comment handling misses a 'type="comment"' field. Is that vital? 
- 
- Test: If this works right, the following will be highlighted as a single comment: 
-  << 
-  /*** 
-  */ 
-  ***/ <- green, not black (note: Scala parses these differently; this is just to test the mode) 
-  << 
--> 
<state id="Multilevel Comment AK" color="#236E25" type="comment" font-style="italic"> 
    <begin><regex>/\*\*(?'commentCatch'\*+)</regex></begin> 
    <end><regex>(?#see-insert-start-group:commentCatch)\*\*/</regex></end> 
    <import mode="Base" state="EmailAndURLContainerState" keywords-only="yes"/> 
</state> 

您可能還需要添加type="comment"現有的一些評論亮點規則。我不確定這是否至關重要(除Scala之外的其他模式)。

關於SubEthaEdit modes的信息。

+1

Upvote,因爲這是「正確的」答案。當編輯沒有正確突出顯示某個選定語言的合法構造時,可以選擇其他編輯器或修復語法突出顯示。毫無疑問,這位編輯的其他用戶會感謝你英勇地選擇後者。 – cbmanica

3

還有一個選項是你遺漏的。任何形式的評論有禁用語法高亮,以及沒有的缺點包括在IDE重構(Emacs的+ Ensime,IDEA,Eclipse的,等)或其他代碼智能工具,所以我更喜歡下面的方法來代替:

def ignore(block: => Any) =() 
def ignoreIf(cond: Boolean)(block: => Any): Unit = if (!cond) block 

ignore { 
    // experimental and/or disabled code 
    syntaxHighlightingEnabled(true, 3, "foobar") 
} 

ignoreIf(SomeFeatureEnabled) { 
    // experimental and conditionally enabled code 
    syntaxHighlightingEnabled(true, 3, "foobar") 
} 
0

我使用'度刪除'。 (1)註釋掉。 (2)如果它的代碼,我不需要了,但可能會發現有用以後/別處,我有一個「.boneyard」文件夾,我折騰的代碼片段(剛生產的源代碼樹) - 出奇的方便。 (3)只要刪除它,並依靠源代碼管理,如果事實證明我畢竟需要它。