为什么尾随空格很大?[关闭]


116

对于程序员来说,尾随空白就足够了,因为像Emacs这样的编辑器具有特殊功能来突出显示或自动删除它,并且许多编码标准都要求您消除它的所有实例。我不确定为什么。我可以想到一个避免不必要的空格的实际原因,那就是如果人们不小心避免使用空格,那么他们可能会在两次提交之间进行更改,然后,由于某些人删除或删除了一些差异,因此我们发现它们之间存在差异添加了一个空间。

听起来这是避免它的一个很好的理由,但是我确实想看看是否还有更多的理由。那么,为什么尾随空格这么大呢?


30
尾随空白确实是提交噪声。想不到其他任何原因。
yannis 2011年

17
一个好的 diff工具应该能够忽略尾随空格(如果需要,也可以领先)。毕竟,Emacs可以做到,为什么不使用差异工具?
FrustratedWithFormsDesigner

4
使用“结束”按钮导航到字符串的末尾可能会出现很多尾随空格的情况。
Iarek Kovtunenko

11
我认为您是用错误的方式问这个问题。另一种解决方法是:«尾随空白有什么优势?»。当问正确的问题时,答案变得非常明显;)
deadalnix

7
也许您应该尝试在Whitespace中进行编程。* 8')
Mark Booth,

Answers:


76

这对我很重要的原因:

  • 当我按下“结束”键时,我希望光标移至该行的末尾(取决于我正在使用的编辑器以及其配置方式),并且希望能够立即开始键入。如果光标到达那里,而我必须删除3或4个字符,这很烦人。特别是在整个文件中不一致时。

  • 当我具有跨越多行的字符串文字时,尾随空格会使输出字符串在使用时看起来不正确。

尽管不是严格编程,但是如果文件中存在尾随/前导字符,空格将严重破坏数据输入,该文件将被解析并用作其他内容的输入。当有人用Excel或其他方式编辑干净的生成的输入文件,然后再拖尾空白(以及其他格式问题)时,这种情况最容易发生。


8
第一点是您的编辑器的问题,而不是尾随空白。
Marjan Venema

32
@MarjanVenema:是的,可以将编辑器设计为可进入最后一个NON-whitespace,但是您永远不会知道尾随的whitespace(除非以其他方式表示,否则我可能会发现END并不奇怪)不要去到行尾,这是我习惯的。多行字符串文字会出现问题。因此,编辑器将必须知道,在多行字符串文字中,END应该转到最后一个字符,包括空格。我使用的编辑器不是那么聪明。
FrustratedWithFormsDesigner

2
如果不选择多余的空格,我很难用鼠标添加选择,这对于剪切粘贴可能很重要。否则在提交(最终冲突!)时一无所获。没什么大不了的,但是有很多烦恼。它给人的感觉是以前的开发人员很懒,希望您离开他/她的混乱状态。
deadalnix

1
@deadalnix:当然,这就是为什么您需要一个优秀的编辑器,并提供适合大多数人的喜好的选项。因此,点1是编辑器的问题,而不是尾部的空白。
Marjan Venema

1
要点1恰恰是我更喜欢尾随空格的特殊风格的原因:空白行以它们分隔的代码缩进。这样就可以立即插入新的代码,而不必缩进英寸
熊Chiamiov

29

我真的很讨厌尾随空格,但是确切的原因有点含糊。

我想这种感觉的起源不是在编程中,而是在桌面出版领域。您是否有需要别人排版的文档需要排版成出版物?在所有现代出版物中,特别是在使用列的情况下,习惯上是使句子在一个段落中顺序地跟随彼此,而不是为每个句子开始新的一行。好吧,当存在尾随空格时,需要花费更多的精力才能将其正确处理(大量搜索和替换操作消除了双精度空格等)。

我知道其他原因(在编程中)不是很好的原因,但是它们以强烈的方式困扰着我的潜意识,以至于迫使我消除它:

  • 占用了多余的存储空间
  • 编译时,解析器将无缘无故跳过多余的字符
  • 启用WordWrap且尾随空格不适合时,某些编辑器可能会添加额外的空白行

是的,是的,我知道!我知道,这些都是垃圾原因。我不是完美主义者,但是...也许我是吗?

我能想到的最后一个原因是光标移动不一致。感觉就像光标悬在行尾的稀薄空气中,向右迈出的每一步都可能导致其掉落或悬停到未知的程度,只是感觉不稳定(就像Super马里奥曾经跳下去)。

也许我可以被诊断为Trailspacefobia?


不是我的领域,但对我来说似乎很奇怪……您在桌面出版中使用哪种排版系统,默认情况下不会忽略尾随/多个空格?我认为LaTeX和大多数编程语言的使用方式在任何地方都是标准的,除了在消费者级别的所见即所得的垃圾中。
大约

Adobe InDesign(是否也属于消费者级别的所见即所得垃圾?)。它将忽略尾随空格,是的,但是将所有换行符替换为段落中的空格,您最终将得到双倍空格(不被忽略),然后需要额外的替换来消除这些空格。
路易·萨默斯

“台式机发布”与“排版系统”无关。
rakslice

22

这些答案中的许多几乎都涉及到它对我不利的原因,但基本上是:它“破坏了”文本编辑器。我的经验是关于vim。

Vim的设计使普通操作可以清晰地映射到字母,您甚至不必考虑要敲什么字母或组合键。各种热键使光标能够快速地在文本周围跳转,从而只需几次击键即可将其移动到所需的位置。甚至像折叠代码块之类的事情也很快,因为您可以按END或$跳到行尾,光标应与{或}或(或)重叠,所以您无需中断思维在屏幕上得到一个想法。

但是随后出现了一些尾随空白,并且光标的移动不再可预测。您的键入过程被打断了,因为您看不见的东西在影响光标的位置,因此您必须打破思路将其发送到应该的位置。

您是否曾经注意到人们在真正专注于一项任务而有人打扰他们时会感到恼火吗?是的,发现时它至少有望尾随空白是正是这样。

作为旁注,我还注意到,不关心尾随空格的人是使用鼠标进行导航的人,并且因此会因此而成为打字速度较慢的人...


2
附带说明,键入速度与是否使用鼠标进行导航无关。某些导航非常适合鼠标。; p
Steven Jeuris 2011年

2
如果使用vim,则可以快速删除所有结尾的空格:%s/ *$//
Giorgio

1
@Giorgio我知道,但我不能随便做,因为它算作版本控制的变更
Izkata 2014年

@izkata:是的。我重新格式化文件,然后在检入之前必须先对其进行更改,但是如果其他开发人员继续使用尾随空白来检入文件,这将是一场失败的战斗。
乔治

17

令人惊讶的是,最明显的答案丢失了:尾随空格可能并且将产生难以发现的错误。

最明显的情况是多行字符串。Python,JavaScript和Bash是受此影响的几种语言示例:

print("Hello\·
····World")

产生:

  File "demo.py", line 1
    print("Hello\
                 ^
SyntaxError: EOL while scanning string literal

如果未将编辑器配置为显示空白字符,这在某种程度上是难以理解的,并且难以解决。

虽然语法高亮可以帮助避免这种情况,但通过在行尾不留空格,甚至更容易避免出现问题。这就是为什么某些样式检查器在遇到尾随空白时会发出警告,而某些编辑器会自动对其进行修剪的原因。

在此处输入图片说明

插图:语法高亮可以帮助避免在可能导致bug的情况下尾随空格,而不仅仅是依靠它。

在上一个答案中简要提到的另一个上下文是存储在文件中的数据。

例如,包含尾随空格的CSV文件可能会导致数据不一致,这也很难检测到:符合标准的解析器将对空格进行修剪(标准表示前导或尾随空格无关紧要,除非用双引号引起来),但是一些解析器可能行为不端,并将空格保留为值的一部分。

其他自定义格式可能会特别认为空格是值的一部分,从而导致一致但仍然难以调试的情况。


14

我最近花了一天时间寻找一个错误,该错误原来是数据中意外的空白。


13
我认为这一个错误;人为生成的输入的代码处理应丢弃尾随空格,并且通常也应丢弃前导空格。
凯文·克莱恩

@kevincline-至少应该如此。如果它在屏幕或打印输出上不可见,我不想考虑它。
Rook

6
因为您花了一天的时间寻找错误,所以尾随空格很大吗?请修改您的答案,以使其更具笼统性。添加一些背景,论据,...我个人从未遇到过空白问题,但我并不能以此作为结论,它们也不是问题。
史蒂芬·杰里斯

2
@Steven Trailing空格导致了一个难以跟踪的错误。似乎对我来说是一个很好的答案。您可以想象在这种情况下某些数据解析代码可能会中断。
Will Sheppard 2014年

我在数据末尾删除了空格,但测试失败。您对此负责。你叫什么名字?我应该把帐单寄到哪里?
Thomas Weller

8

当我选择程序源代码以进行复制和粘贴(或删除)时,发现在行尾看到所有不规则的多余空白会有些烦人:因为我必须在选择代码时阅读代码,结尾的空格是不必要的噪音。示例(点代表空白):

if (fp)........
{....
    fclose(fp);.
}
else
{.....
    prinft("File is NULL\n");
}..

这个例子是人为的,但是我看过很多看起来像这样的代码。


7

除了明显的问题,它在某些情况下会中断解析?正如另一位发帖人所指出的那样,它可能导致微妙且难以追踪的错误。空格并不总是无关紧要的。在某些情况下,尾随空格会显着改变一行代码或数据的含义。

在大多数情况下,空格用于为人类读者格式化代码。尾随空格可能表示几件事情,包括:

  • 陈述不完整;
  • 缺少评论;
  • 编辑错误;要么
  • 草率的编辑。

其中的两个可能会导致错误的功能,而另一个可能会使理解代码变得更加困难。


4

有些编程语言对终端空白很敏感。例如,如果一行的末尾有空格,则TCL脚本将给出错误。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.