【问题标题】:Lua Semicolon ConventionsLua 分号约定
【发布时间】:2013-05-27 13:45:27
【问题描述】:

我想知道 Lua 中是否有使用分号的通用约定,如果有,我应该在哪里/为什么要使用它们?我来自编程背景,所以用分号结束语句在直觉上似乎是正确的。但是,当人们普遍接受分号结束其他编程语言中的语句时,我担心为什么它们是"optional"。也许有一些好处?

例如:来自lua programming guide,这些都是可以接受的、等效的并且在语法上是准确的:

a = 1
b = a*2

a = 1;
b = a*2;

a = 1 ; b = a*2

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

作者还提到:Usually, I use semicolons only to separate two or more statements written in the same line, but this is just a convention.

这是 Lua 社区普遍接受的方式,还是有其他大多数人喜欢的方式?还是跟我个人喜好一样简单?

【问题讨论】:

    标签: lua conventions


    【解决方案1】:

    Lua 中的分号一般只有在一行写多个语句时才需要。

    例如:

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

    也可以写成:

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

    在我的脑海中,我不记得在 Lua 中我不得不使用分号的任何其他时间。

    编辑:查看 lua 5.2 参考资料,我看到另一个常见的地方,您需要使用分号来避免歧义 - 您有一个简单的语句,后跟一个函数调用或括号来对复合语句进行分组。这是位于here的手动示例:

    --[[ 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')
    

    【讨论】:

    • 实际上,local a,b=1,2 print(a+b) 是有效的 Lua 并且可以满足您的期望。您只需要分号来防止歧义。顺便说一下,空间也是如此。所以这也可以print(1)print(2)
    【解决方案2】:

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

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

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

    【讨论】:

    • 这就是local function f 有效的原因,但我不明白这个答案与手头的问题有什么关系。
    【解决方案3】:

    许多不需要分号的编程语言(包括 Lua)都有不使用分号的约定,除了在同一行分隔多个语句

    Javascript 是一个重要的例外,它通常按照约定使用分号。

    Kotlin 在技术上也是一个例外。 Kotlin Documentation 说不仅不要在非批处理语句上使用分号,而且要

    尽可能省略分号。

    【讨论】:

      【解决方案4】:

      在局部变量定义中,我们时不时会得到模棱两可的结果:

      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

      【讨论】:

      【解决方案5】:

      一行中有多个东西,例如:

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

      可以缩短为:

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

      另外值得注意的是,如果你习惯了 Javascript,或者类似的东西,你必须用分号结束一行,而且你特别习惯这样写,那么这意味着你不会有删除那个分号,相信我,我也习惯了 Javascript,我真的,真的忘记了你不需要分号,每次我写一个新行!

      【讨论】:

      • 分号在 JavaScript 中也是可选的。与 Lua 不同,大多数人还是按照惯例编写它们。但所谓的“StandardJS”风格指南 (standardjs.com) 主张省略它们,就像在 Lua 中一样。
      • @LaurensHolst 你说的一切都是正确的,但是那个 StandardJS 的事情绝对是错误的。他们的论点是“在一天结束的时候,只需要选择一些东西”,他们似乎不知道根深蒂固的 Javascript 约定是使用分号
      • @TheRealSuicune 你是否意识到虽然程序不会死,但你实际上是在违反规则?你有没有试过写<!-- comment而不是// comment?它们都有效,但它打破了惯例,从而使人们感到困惑。
      猜你喜欢
      • 1970-01-01
      • 2017-05-18
      • 2013-10-16
      • 1970-01-01
      • 2019-12-17
      • 2017-08-23
      • 2013-11-20
      • 2014-11-26
      • 2015-07-15
      相关资源
      最近更新 更多