评论限制

6

在Ruby 1.9中,关于换行结束位置的限制被放宽了,因此现在我们可以以一个句点开头表示方法调用。当我们混合使用链式和非链式方法时,想要显示下一个非链式方法的起始位置时,这种方法很方便。如果没有这个新功能,我们最好的选择可能是使用缩进:

method1(args1).
  method2(args2).
  method3(args3)
method4(args4).
  method5(args5).
  method6(args6)

或者插入一个空行。但这样做很不方便,因为我们必须注意缩进,同时,在链中的最后一个方法调用之外,不要忘记加上句号。因此,我经常因为多余或缺失句号而产生许多错误。有了这个新功能,我们可以更好地完成它:

method1(args1)
.method2(args2)
.method3(args3)
method4(args4)
.method5(args5)
.method6(args6)

这里的句号在视觉上起到缩进符的作用。

问题是,当你想在以句号开头的行之前插入注释时,会返回一个错误。

method1(args1)
# method2 does blah blah
.method2(args2)
# method3 then does foo foo
.method3(args3)
method4(args4)
# method5 does blah blah
.method5(args5)
# method6 then does bar bar
.method6(args6)

# => error

或者

method1(args1)
 # method2 does blah blah
.method2(args2)
 # method3 then does foo foo
.method3(args3)
method4(args4)
 # method5 does blah blah
.method5(args5)
 # method6 then does bar bar
.method6(args6)

# => error

看起来 "#...." 并不是简单地被删除,而是以某种方式与代码进行交互。发生了什么?这里的确切限制是什么?当句号在行尾时,这种情况就不会发生。

method1(args1).
  # method2 does blah blah
  method2(args2).
  # method3 then does foo foo
  method3(args3)
method4(args4).
  # method5 does blah blah
  method5(args5).
  # method6 then does bar bar
  method6(args6)

  # => no error
1个回答

1
词法解析器可能会比较“宽松”,因为它会忽略一个点之前的单个换行符和空格。它可能不允许多个换行符。这将把链接语句分成一堆无意义的混乱,而且处理起来更加复杂,容易出现误判。话虽如此... 如果您必须添加内联注释,则可能不适合使用简洁的链接语句。

我经常有一系列的单行代码,每个都执行特定的任务,逐行注释是有意义的。 - sawa
这仍然违反了惯例。你不应该每行都加注释 - 代码应该能自我解释。在某些情况下,一些内联注释是有帮助的。特别是对于链式调用,您可以将这些语句拆分为调用列表,并在任何不明确的语句后附加非常短的行尾注释(如果需要的话)。没有人想读一句话长的注释,然后再阅读其所属的长代码。我们懂了。 - coreyward
正好相反。一行代码可能有一个块,或者有一个复杂的正则表达式。注释可以是简单的短语。此外,我经常在链中测试几个一行代码的替代方案,并需要注释掉未测试的替代方案。 - sawa

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