Lua 分号约定

32

我在想Lua中有没有关于分号用法的通用约定,如果有的话,我应该在哪里/为什么要使用它们?由于我的编程背景,使用分号结束语句似乎是直观正确的。但是我担心为什么它们是“可选的”,因为在其他编程语言中分号通常被接受为语句结束符。也许有一些好处吗?

例如:从lua编程指南中可以看出,这些写法都是可以接受,等效且语法正确的:

a = 1
b = a*2

a = 1;
b = a*2;

a = 1 ; b = a*2

a = 1   b = a*2    -- ugly, but valid

作者还提到:通常情况下,我只使用分号来分隔同一行中的两个或多个语句,但这只是一种约定。

这种做法是否被 Lua 社区普遍接受,还是有其他更受欢迎的方式?还是仅仅是我的个人偏好?

5个回答

39
Lua中的分号通常仅在一行上编写多个语句时才需要。
因此,例如:
local a,b=1,2; print(a+b)

或者写作:

local a,b=1,2
print(a+b)

就我个人而言,我无法回忆起在Lua中还有其他必须使用分号的情况。

编辑:查看Lua 5.2参考文献,我发现另一种需要使用分号避免歧义的常见情况是,在简单语句后面跟着一个函数调用或括号以组合复合语句。以下是手册示例,位于此处

--[[ Function calls and assignments can start with an open parenthesis. This 
possibility leads to an ambiguity in the Lua grammar. Consider the 
following fragment: ]]

a = b + c
(print or io.write)('done')

-- The grammar could see it in two ways:

a = b + c(print or io.write)('done')

a = b + c; (print or io.write)('done')

23
实际上,“local a,b=1,2 print(a+b)”是有效的Lua代码,并且能够按照你期望的方式正常运行。你只需要使用分号来防止歧义。顺便说一下,对于空格也是一样的。因此,以下代码也是正确的:“print(1)print(2)”。 - dualed

0
许多编程语言(包括Lua)不需要分号,因此有一个惯例是除了在同一行上分隔多个语句外,不使用分号。Javascript是一个重要的例外,通常按照惯例使用分号。Kotlin也是一个技术上的例外。Kotlin文档不仅建议在非批处理语句中不使用分号,而且尽可能省略分号。

0

在本地变量和函数定义中。这里我比较两个非常相似的示例代码来说明我的观点。

local f;  f = function() function-body end

local f = function() function-body end

当函数体部分包含对变量"f"的引用时,这两个函数可能返回不同的结果。


这就是为什么“本地函数f”是有效的,但我不明白这个答案与手头的问题有何关联。 - Nicol Bolas

-1
在本地变量定义中,我们有时会得到模棱两可的结果:
local a, b = string.find("hello world", "hello") --> a = nil, b = nil

有时候a和b被赋予正确的值7和11。

所以我别无选择,只能遵循以下两种方法之一:

  1. local a, b; a, b = string.find("hello world", "hello") --> a, b = 7, 11
  2. local a, b a, b = string.find("hello world", "hello") --> a, b = 7, 11

这个答案是不正确的。首先,find 的正确值为1、5。其次,第一条语句可以很好地将这些值放入 ab - Nicol Bolas

-1

如果需要在一行上有不止一个内容,例如:

c=5
a=1+c
print(a) -- 6

可以缩短为:

c=5; a=1+c; print(a) -- 6

值得注意的是,如果你习惯于使用JavaScript或类似的语言,在每行代码结尾需要加上分号,而且你已经养成了这个习惯,那么在使用这种语言时就不需要去掉分号。相信我,我也习惯于使用JavaScript,每次写新的一行代码时都会忘记不需要加分号!

4
在 JavaScript 中,分号是可选的。与 Lua 不同,大多数人按照约定仍然使用分号。但所谓的“StandardJS”样式指南(https://standardjs.com/)建议省略它们,就像在 Lua 中一样。 - Laurens Holst
@LaurensHolst 你说的一切都是正确的,但 StandardJS 这个东西肯定是错的。他们的论点是“最终,只需选择某些东西”,而他们似乎不知道 _深入人心的 JavaScript 约定是使用分号_。 - Sapphire_Brick
@TheRealSuicune,你是否意识到,尽管程序不会死亡,但你实际上正在违反规则?你是否曾经尝试过写<!-- comment而不是// comment?它们都可以工作,但这会破坏惯例,从而使人们感到困惑。 - Sapphire_Brick
@Sapphire_Brick 实际上,StandardJS 似乎更倾向于不使用分号。例如,在他们的网页上,他们用以下语言描述了“semistandard”:“Semistandard:与标准相同,但有分号(如果你必须要用)”。这种语言传达了“标准”是没有分号的信息,如果你使用分号,那么你就是在使用“semistandard”。此外,“(如果你必须要用)”的评论意味着“semistandard”(因此使用分号)不是首选样式。 - deltamind106

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接