使多余的标记可选

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 之间。你不必评估表达式来查看它们是否完整(即因为 eol ; 是可选的)。当然,可以添加括号以确保表达式完整,但这些也是可选的和多余的。--NDT

觉得更容易。

首先,在编写良好的 C/Pascal/Lua/... 中识别块并不困难,这要归功于缩进。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 的生命周期,如果它是一个大型对象并且 while 循环的其余部分非常耗时,这可能很有用。

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

C 通过要求条件表达式用 ( ) 括起来来解决在条件表达式之后跟语句的歧义,它使用 { } 而不是 do/thenend;它还要求语句以 ; 结尾。最终,这几乎是一样的 - 相对吸引力将取决于你是否更喜欢标点符号而不是英文单词。


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