为什么'直到'存在?

are*_*euz 20 linux bash shell

是否有任何理由将命令until实现到bash/shell中(我还不确定哪个)?对于while声明的否定,你有什么不能做的吗?它比使用NOTCPU功能更快吗? - 不太可能......

iva*_*eev 21

Bash支持它,因为它符合POSIX - 特别是IEEE Std 1003.1,2004版 - Shell命令语言 - 直到循环.该功能早于GNU,GNU bashrepo 自 21年前的第一次提交以来就拥有它.

正如Guillaume在另一个答案中解释的那样,该功能的基本原理是(误导性的)可读性.他们试图在这里对事物进行微观管理,因为shell语言最初是针对最终用户而不是专业程序员(如BASIC和SQL).

然而,在相同代码复杂性下完全相同的冗余语法被证明比它的价值更麻烦:通过为库存构造提供两个而不是一个规范形式,它实际上损害了可读性而不是改进它并引入做出不必要的决定1.这就是为什么它只出现在那个时代设计的几种语言中,同样也是为了"接近自然语言" - 比如Perl和Visual Basic.

如今,这种方法已演变为语法糖概念2:只有通过替换足够频繁使用的整个样板构造来显着简化代码,才会引入冗余构造.C#就是一个很好的例子.


1 "在这里使用哪一个?当我改变条件时改变它?我为什么要关心?" 根据我的经验,它在Pascal过程与函数中是相同的:我记得在设计代码时必须多次在这两个子程序之间切换子程序.它只会给程序员带来多余的工作,从而浪费他们的时间.

2 我在这里缩小了这个术语,因为我是从语言设计师的角度来表达的.它更像是"现在被认为是好的语法糖".从语言设计者的POV开始,任何其他SS实际上都不存在.

  • "这就是为什么它只出现在那个时代设计的几种语言中,同样也是为了"接近自然语言"加上Ruby,因为有些人拒绝从历史中学习;) (2认同)

vda*_*vid 7

您可以做的一切until都可以完成while.由于这种"优化",你的代码可能缩短了1个字符,而且有些解释器可能会稍快一些,但与代码中的其余部分相比,这些代码可能会非常微不足道.

据我所知,这种说法大多存在,因为有些语言可以使用它,所以从语言移植到bash更容易.但截至今天(2017年),我认为绝大多数语言都支持这种while说法,而且很少有人支持until.我建议专门使用,while以便其他阅读代码的程序员不会浪费时间问自己是什么until.

更不用说某些语言有一个until在循环结束时(而不是开头)执行的语句,这会带来很多不必要的混淆.


Gui*_*ume 7

这种说法的原因并不是技术性的(事实上,倒置while具有相同的含义),而是语义.

until (condition) {do something}

可以更接近自然语言而不是

while (not condition) {do something}

当条件本身表示为负数时尤其如此,因为读取多个否定不会整齐地流动:

while (not not_connected) {} VS until (not_connected) {}.

  • 这与在Pascal中的"直到"不一样.在Pascal中,`while`和`until`之间的区别是条件被检查的时间.`while`循环在执行正文之前检查条件.`until`循环在执行主体后检查条件. (6认同)
  • "_当条件本身被表示为否定时",无论如何你都应该用大鳟鱼打耳光. (2认同)