在Scala中注释掉代码的部分

9

我正在寻找一种类似于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具有匹配--[==[]==]等内容。 我觉得我被宠坏了?

那么-我是否忽略了一些有用的技巧?


1
我不明白为什么需要支持 /*** /* ... */ ***/ 嵌套风格的块。 - om-nom-nom
5
最好的做法可能是直接删除代码,如果您想在某个时候将其恢复,请使用版本控制系统(或IDE中的本地历史记录)。一旦您熟悉了它,这样做就和注释代码一样快,而且更干净。逐渐累积过多的注释代码很容易使代码变得混乱,即使有最好的意图,也很少有人会对其进行清理。 - Brian Smith
2
你能再详细说明一下你的使用情况吗?你说“为了保留实验性或过期的代码一段时间”,但不清楚为什么仅使用/* */就不够好了。正如其他人指出的那样,你要避免保留大量未编译的代码,因为你将会面临代码腐败问题。因此,你可能需要考虑将你目前没有使用但将来可能需要的代码分离成文件/模块/库。 - markltbaker
@om-nom-nom:我真正想要的,我想,就是让语法高亮在嵌套的/../块中正常工作。然后我可以简单地使用多个星号作为约定。对于其他人来说:用例确实不是大块,因为Scala本身就很紧凑。这是一种工作方式,即我经常为我可能想再看几天的方法或类创建/*** REMOVE? ... ***/块。是的,版本控制是下一个阶段。当我开始处理这个问题时,我认为编译器中没有嵌套的/../,因为它们的语法高亮失败了。感谢您的意见。 - akauppi
5个回答

5
为什么不利用您的源代码控制机制?将代码保持分离,作为单独的文件进行检查并忘记它。我不希望我的日常代码库被这种东西弄得一团糟。
请注意,如果您不经常使用此代码(例如在自动化测试中等),它将遭受 代码腐败。一旦您注释或存储此类内容,依赖项就会移动,并且您会发现不久后它将无法与现有代码库链接。

是的,从长远来看,这正是我采取的方法。有一个“未使用”文件夹用于整个源文件(可能会腐烂)。我想这是关于粒度的问题。第一阶段:注释掉。第二阶段:未使用的文件夹。第三阶段:从版本控制中删除。最好的解决方案?修复我使用的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模式的信息,请访问此处

1
点赞,因为这是“正确”的答案。当编辑器不能正确地语法高亮显示所选择的语言中的合法结构时,要么选择另一个编辑器,要么修复语法高亮显示。毫无疑问,该编辑器的其他用户将感谢您英勇地选择了后者。 - cbmanica

4

你还忽略了一种选项。任何形式的注释都有缺点,会禁用语法高亮,并且不会包含在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) 直接删除它,并依靠源代码控制,如果最终发现我仍然需要它。


0
受Lua编程语言的启发,我使用:
def */ = () // noop function, def or val


/*

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

*/

为了启用整个代码块,只需在“/*”后面添加一个“/”,即:

def */ = () // noop function


//*

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

*/

现在它会打印出 "Hello world!"。


我不知道这与Lua语法有什么关系(我只了解到大约2012年),也不是我的原始问题的答案。无论如何,这已经过去了,我似乎不再有相同的问题了(也许因为在此期间转移到了IntelliJ IDEA)。 - akauppi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接