在Scala中注释掉部分代码

时间:2012-11-29 17:10:07

标签: scala comments

我正在寻找一种类似C(++)#if 0的方法,能够注释掉整个Scala源代码,以便暂时保留实验或过期代码。

我尝试了几种替代方案,并希望听到您使用的内容,以及是否有更好的方法?

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

我的编辑器让这很简单,但事实并非如此。它很容易与实际的一行评论混合在一起。

然后我认为有原生的XML支持,所以:

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

在XML中包装有效,除非您在块中有<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 --[==[匹配]==]等等。我想我被宠坏了?

那么 - 我正在监督一些有用的技巧吗?

5 个答案:

答案 0 :(得分:5)

为什么不直接使用源代码控制机制?保持代码分开,将其作为单独的文件检查并忘记它。我不希望我的日常代码库充满了这种东西。

但请注意,如果您不经常使用此代码(例如在自动化测试等中),则会受到code rot的影响。一旦你评论或以其他方式搁置这些东西,依赖关系将继​​续前进,你会发现它不久就不会链接到现有的代码库。

答案 1 :(得分: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的信息。

答案 2 :(得分: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")
}

答案 3 :(得分:0)

我使用&#39;删除程度&#39;。 (1)评论出来。 (2)如果它的代码我不再需要但可能在以后/其他地方找到有用的,我有一个&#39; .boneyard&#39;文件夹我抛出代码片段(就在生产源代码树之外) - 非常方便。 (3)只要删除它,并依赖源控制,如果事实证明我毕竟需要它。

答案 4 :(得分:0)

受我使用的Lua编程语言启发:

def */ = () // noop function, def or val


/*

println("Hello world!")
// more code

*/

要启用整个代码块,只需在“ / *”上添加一个“ /”即可,即

def */ = () // noop function


//*

println("Hello world!")
// more code

*/

现在它会显示“ Hello world!”。