使多余的标记可选 |
|
if
语句后使用 'then',在 while
和 for
语句后使用 '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% 向后兼容。
我发现使用 do
和 then
更容易阅读。当你阅读它时,它更容易扫描。更容易看到块的开始和结束位置,并且你知道一个作用域在 do
和 end
之间。你不必评估表达式来查看它们是否完整(即因为 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
此外,do
在 for
或 while
语句中不能是**可选的**,因为块本身可以以 do
语句开头
while x > 100 do do local y = f(x) g(y) h(y) end -- ... end
上面的代码限制了 y
的生命周期,如果它是一个大型对象并且 while
循环的其余部分非常耗时,这可能很有用。
如果 do
不能是可选的,那么唯一明确的可能性是必需的或禁止的;如果它被禁止,那么上面在 if
语句中提到的歧义是无法解决的。
C
通过要求条件表达式用 ( )
括起来来解决在条件表达式之后跟语句的歧义,它使用 {
和 }
而不是 do
/then
和 end
;它还要求语句以 ;
结尾。最终,这几乎是一样的 - 相对吸引力将取决于你是否更喜欢标点符号而不是英文单词。