【问题标题】:Commenting out portions of code in Scala在 Scala 中注释掉部分代码
【发布时间】:2012-11-29 17:10:06
【问题描述】:

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

我尝试了几种替代方法,想听听您使用的是什么,以及您是否想出了更好的方法?

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

我的编辑器让这一切变得简单,但这并不是真正的 The Thing。它很容易与实际的单行 cmets 混合。

然后我发现有原生 XML 支持,所以:

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

在 XML 中包装可以工作,除非你在块中有 &lt;tags&gt;

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)
  */
***/

..但仅匹配 /**/,而不是 /******/。这意味着块内的 cmets 需要平衡。并且 - SubEthaEdit 当前的 Scala 语法高亮模式在这方面失败了。

作为比较,Lua--[==[ 匹配 ]==] 等等。我觉得我被宠坏了?

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

【问题讨论】:

  • 我不明白你为什么需要支持/*** /* ... */ ***/嵌套样式块
  • 最好只删除代码,如果您想在某个时候恢复它,请使用您的版本控制系统(或 IDE 中的本地历史记录)。一旦你熟悉它,它就一样快,而且更干净。注释掉是随着时间的推移积累垃圾的好方法,即使是出于好意,它也很少会被清理干净。
  • 您能否进一步说明您的用例?您说“暂时保留实验性或过期代码”。但尚不清楚为什么仅使用 /* */ 还不够好。正如其他人指出的那样,您希望避免保留大量代码不被编译,因为您将遇到代码腐烂问题。因此,您可能需要考虑将当前未使用但将来可能需要的代码分成文件/模块/库。
  • @om-nom-nom:我想,我真正想要的只是语法高亮与嵌套的 /*..*/ 块一起工作。然后我可以简单地使用多个星号作为约定。对其他人来说:用例真的不是大块,因为 Scala 无论如何都非常紧凑。这是一种工作方式,即我经常做 /*** REMOVE? ... **/ 块用于我可能想再看几天的方法或类。是的,版本控制是下一个阶段。当我开始这张票时,我认为嵌套的 /..*/ 在编译器中不起作用,因为它们的语法突出显示失败。感谢您的意见。

标签: scala comments


【解决方案1】:

为什么不直接利用您的源代码控制机制?将代码分开,将其作为单独的文件签入并忘记它。我不希望我的日常代码库被这类东西弄得一团糟。

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

【讨论】:

  • 是的,从长远来看,这正是我所采取的方法。整个源文件(可能会腐烂)都有一个“未使用”文件夹。我猜这是关于粒度的。第一阶段:注释掉。第二阶段:未使用的文件夹。第三阶段:从版本控制中删除。最佳工作解决方案?修复我使用的 Scala 编辑器中的语法高亮。终极解决方案:将检查即将推出的 Scala 宏。
【解决方案2】:

我修改了 Scala 模式的 SyntaxDefinition.xml 以支持 /***...***/ 样式 cmets。

这与 Scala 解析器对嵌套 /*...*/ cmets 的支持不同,但我没有为我的编辑器找到表达这一点的方法。

如果有人想做同样的事情,这里是:

<!-- 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 的信息。

【讨论】:

  • 赞成,因为这是“正确”的答案。当一个人的编辑器没有正确地突出显示所选语言中的合法结构时,一个人要么选择另一个编辑器,要么修复语法突出显示。毫无疑问,该编辑器的其他用户会感谢您英勇地选择后者。
【解决方案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")
}

【讨论】:

    【解决方案4】:

    我使用“删除度数”。 (1) 注释掉。 (2) 如果它是我不再需要但可能在以后/其他地方发现有用的代码,我有一个 '.boneyard' 文件夹,我在其中扔代码片段(就在生产源代码树之外)——出奇的方便。 (3) 删除它,如果我需要它,请依赖源代码管理。

    【讨论】:

      【解决方案5】:

      受我使用的 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)。
      • 来自[Lua 编程(第一版)](lua.org/pil/1.3.html)
      猜你喜欢
      • 1970-01-01
      • 2015-09-30
      • 2011-08-07
      • 1970-01-01
      • 2021-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-11
      相关资源
      最近更新 更多