使冗余标记可选

lua-users home
wiki

Lua 在 if 语句后要求 'then',在 whilefor 语句后要求 'do'。这些都是完全冗余的,我建议将它们设为可选。它们会不必要地磨损我们的肌腱,并使代码更难阅读(眼睛更容易区分开头和结尾)。没有它们的代码更简洁易读。

  local n = 10
  if n > 5
    for i=1,n
      local x = n
      while x > i
        x = x - 1
        io.write(x)
      end
      io.write('\n')
    end
  end

这是对 Lua 代码(LuaPowerPatches)的微小改动,提高了 Lua 的性能(虽然微不足道,但可证明),并且 100% 向后兼容。

我发现带有 dothen 的代码更容易阅读。阅读时更容易扫视。更容易看出块的开始和结束,并且你知道一个作用域在 doend 之间。你不必评估表达式来判断它们是否完整(例如,因为行尾的 ; 是可选的)。当然,可以添加括号来确保表达式完整,但这些也是可选的,也是多余的。--NDT

觉得更容易。

首先,得益于缩进,在写得好的 C/Pascal/Lua/等语言中,识别块 hardly 难。Python 甚至将缩进作为块作用域的唯一指示符。它有效。

说实话,我很难相信你实际上会寻找 'then' 和 'do' 关键字来判断块的开始位置。我的眼睛会扫视代码的 侧,仅通过缩进来匹配 'if'、'for' 和 'while' 语句与其对应的 'end' 语句。只有在我怀疑缩进误导的情况下,我才会开始扫视代码的 侧。

当然,我不会在一行中写多个语句。也许如果我那样做,我将被迫养成忽略缩进并寻找分隔符来确定代码结构的习惯。但我更愿意一致地格式化代码,相信这样可以更容易识别。

因此,通过一致的格式化使块结构透明化,我们还能如何帮助快速识别?将语句的重要部分放在一行的开头和结尾,眼睛最容易看到的地方。选择好的变量名也适用同样的原则。

  foobar1
  foobar2
  
优于
  foo1bar
  foo2bar
  
同样
  if a
  if e
  
优于
  if a then
  if e then
  
即使你不同意,并且认为这只是品味问题,我认为它没有理由不成为可选的。它对 Lua 没有任何损害。--EricTetz

我也觉得带有 "then" 标记的 Lua 代码并不更容易阅读。将其设为可选,没有任何正当理由不这样做。--DanHollis?

同意。如果我能像 Python 或 Ruby 那样写 'def' 而不是 'function',我会很高兴,因为它更短。--YuraSokolov?

我发现 then 在有多个条件时显得简洁易读,例如

  if
    (cond1 == val1) and
    (cond2 ~= val2) or
    (cond3 <= val3)
  then
    -- code block
  end
为了语法一致性,我投票支持保留它。但另一方面,你也可以说同样的话关于可选的括号 --SajberToffe?


虽然 then 在 Lua 4 中是完全多余的,但在语法被修改为允许以括号表达式开头的调用和赋值语句后,这种情况发生了改变;这次修改使得 ; 语句终止符只成为半可选的。以下代码如果没有 then 就无法编写,因为 ; 只能放在语句之后;没有 then 会造成歧义。
  if x then (funcs[x] or default_func)() end

此外,doforwhile 语句中不能是**可选的**,因为块本身可能以 do 语句开始。

  while x > 100 do
    do 
      local y = f(x)
      g(y)
      h(y)
    end
    -- ...
  end

上述代码限制了 y 的生命周期,如果 y 是一个大型对象而 while 循环的其余部分非常耗时,这可能会很有用。

如果 do 不能是可选的,那么唯一明确的可能性就是必需或禁止;如果它被禁止,那么在 if 语句中上述的歧义就无法解决。

C 通过要求将条件表达式用 ( ) 包围,并使用 { } 代替 do/thenend 来解决在条件表达式后面跟一个语句的歧义问题;它还要求语句以 ; 结尾。最终,这基本上是各有利弊——相对吸引力取决于你更喜欢标点符号还是英语单词。


RecentChanges · preferences
编辑 · 历史
最后编辑于 2005 年 12 月 24 日 上午 12:58 GMT (diff)