对于程序员来说,尾随空白就足够了,因为像Emacs这样的编辑器具有特殊功能来突出显示或自动删除它,并且许多编码标准都要求您消除它的所有实例。我不确定为什么。我可以想到一个避免不必要的空格的实际原因,那就是如果人们不小心避免使用空格,那么他们可能会在两次提交之间进行更改,然后,由于某些人删除或删除了一些差异,因此我们发现它们之间存在差异添加了一个空间。
听起来这是避免它的一个很好的理由,但是我确实想看看是否还有更多的理由。那么,为什么尾随空格这么大呢?
对于程序员来说,尾随空白就足够了,因为像Emacs这样的编辑器具有特殊功能来突出显示或自动删除它,并且许多编码标准都要求您消除它的所有实例。我不确定为什么。我可以想到一个避免不必要的空格的实际原因,那就是如果人们不小心避免使用空格,那么他们可能会在两次提交之间进行更改,然后,由于某些人删除或删除了一些差异,因此我们发现它们之间存在差异添加了一个空间。
听起来这是避免它的一个很好的理由,但是我确实想看看是否还有更多的理由。那么,为什么尾随空格这么大呢?
Answers:
这对我很重要的原因:
当我按下“结束”键时,我希望光标移至该行的末尾(取决于我正在使用的编辑器以及其配置方式),并且希望能够立即开始键入。如果光标到达那里,而我必须删除3或4个字符,这很烦人。特别是在整个文件中不一致时。
当我具有跨越多行的字符串文字时,尾随空格会使输出字符串在使用时看起来不正确。
尽管不是严格编程,但是如果文件中存在尾随/前导字符,空格将严重破坏数据输入,该文件将被解析并用作其他内容的输入。当有人用Excel或其他方式编辑干净的生成的输入文件,然后再拖尾空白(以及其他格式问题)时,这种情况最容易发生。
我真的很讨厌尾随空格,但是确切的原因有点含糊。
我想这种感觉的起源不是在编程中,而是在桌面出版领域。您是否有需要别人排版的文档需要排版成出版物?在所有现代出版物中,特别是在使用列的情况下,习惯上是使句子在一个段落中顺序地跟随彼此,而不是为每个句子开始新的一行。好吧,当存在尾随空格时,需要花费更多的精力才能将其正确处理(大量搜索和替换操作消除了双精度空格等)。
我知道其他原因(在编程中)不是很好的原因,但是它们以强烈的方式困扰着我的潜意识,以至于迫使我消除它:
是的,是的,我知道!我知道,这些都是垃圾原因。我不是完美主义者,但是...也许我是吗?
我能想到的最后一个原因是光标移动不一致。感觉就像光标悬在行尾的稀薄空气中,向右迈出的每一步都可能导致其掉落或悬停到未知的程度,只是感觉不稳定(就像Super马里奥曾经跳下去)。
也许我可以被诊断为Trailspacefobia?
这些答案中的许多几乎都涉及到它对我不利的原因,但基本上是:它“破坏了”文本编辑器。我的经验是关于vim。
Vim的设计使普通操作可以清晰地映射到字母,您甚至不必考虑要敲什么字母或组合键。各种热键使光标能够快速地在文本周围跳转,从而只需几次击键即可将其移动到所需的位置。甚至像折叠代码块之类的事情也很快,因为您可以按END或$跳到行尾,光标应与{或}或(或)重叠,所以您无需中断思维在屏幕上得到一个想法。
但是随后出现了一些尾随空白,并且光标的移动不再可预测。您的键入过程被打断了,因为您看不见的东西在影响光标的位置,因此您必须打破思路将其发送到应该的位置。
您是否曾经注意到人们在真正专注于一项任务而有人打扰他们时会感到恼火吗?是的,发现时它至少有望尾随空白是正是这样。
作为旁注,我还注意到,不关心尾随空格的人是使用鼠标进行导航的人,并且因此会因此而成为打字速度较慢的人...
%s/ *$//
令人惊讶的是,最明显的答案丢失了:尾随空格可能并且将产生难以发现的错误。
最明显的情况是多行字符串。Python,JavaScript和Bash是受此影响的几种语言示例:
print("Hello\·
····World")
产生:
File "demo.py", line 1
print("Hello\
^
SyntaxError: EOL while scanning string literal
如果未将编辑器配置为显示空白字符,这在某种程度上是难以理解的,并且难以解决。
虽然语法高亮可以帮助避免这种情况,但通过在行尾不留空格,甚至更容易避免出现问题。这就是为什么某些样式检查器在遇到尾随空白时会发出警告,而某些编辑器会自动对其进行修剪的原因。
插图:语法高亮可以帮助避免在可能导致bug的情况下尾随空格,而不仅仅是依靠它。
在上一个答案中简要提到的另一个上下文是存储在文件中的数据。
例如,包含尾随空格的CSV文件可能会导致数据不一致,这也很难检测到:符合标准的解析器将对空格进行修剪(标准表示前导或尾随空格无关紧要,除非用双引号引起来),但是一些解析器可能行为不端,并将空格保留为值的一部分。
其他自定义格式可能会特别认为空格是值的一部分,从而导致一致但仍然难以调试的情况。
我最近花了一天时间寻找一个错误,该错误原来是数据中意外的空白。
有些编程语言对终端空白很敏感。例如,如果一行的末尾有空格,则TCL脚本将给出错误。