脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Lua - 浅谈Lua语句

浅谈Lua语句

2020-04-30 11:36脚本之家 Lua

Lua支持大多数传统的语句,跟C语言和Pascal差不多。传统的语句包括:赋值,控制结构,流程调用等。Lua还支持一些不太传统的语句,例如多赋值(听起来有点怪,往下看就明白了)和局部变量声明(这个好像也是传统的吧)。

Lua 中的语句支持赋值,控制结构,函数调用,还有变量声明。

不允许空的语句段,因此 ;; 是非法的。

1 语句组 | chuncks

 

复制代码 代码如下:

chunck ::= {stat[';']}

 

([';'] 应该是表示语句组后面 ; 是可选项。)

2 语句块 | blocks

 

复制代码 代码如下:

block ::= chunck
stat ::= do block end

 

可以将一个语句块显式地写成语句组,可以用于控制局部变量的作用范围。

3 赋值 | assignment

Lua 支持多重赋值。

多重赋值时,按序将右边的表达式的值赋值给左值。右值不足补 nil,右值多余舍弃。

 

复制代码 代码如下:

b = 1
a,b = 4 -- a = 4,b = nil
+++

 

Lua 在进行赋值操作时,会一次性把右边的表达式都计算出来后进行赋值。

 

复制代码 代码如下:

i = 5
i,a[i] = i+1, 7 -- i = 6 ,a[5] = 7

 

特别地,有

x,y = y,x -- 交换 x,y 的值
+++

对全局变量以及表的域的赋值操作含义可以在元表中更改。

4 控制结构

4.1 条件语句

 

复制代码 代码如下:

if [exp]
    [block]
elseif [exp]
    [block]
else
    [block]
end

 

4.2 循环语句

 

复制代码 代码如下:


while [exp]
    [block]
end
+++

 

repeat
    [block]
until [exp]

 

注意,由于 repeat 语句到 until 还未结束,因此在 until 之后的表达式中可以使用 block 中定义的局部变量。

例如:

 

复制代码 代码如下:

a = 1
c = 5
repeat
    b = a + c
    c = c * 2
until b > 20
print(c)            -->     40
+++

 

4.3 break 和 return

break 和 return 只能写在语句块的最后一句,如果实在需要写在语句块中间,那么就在两个关键词外面包围 do end 语句块。

do break end

5 For 循环

for 循环的用法比较多,单独拎出来讲。

for 中的表达式会在循环开始前一次性求值,在循环过程中不再更新。

5.1 数字形式

for [Name] = [exp],[exp],[exp] do [block] end
三个 exp 分别代表初值,结束值,步进。exp 的值均需要是一个数字。
第三个 exp 默认为 1,可以省略。

 

复制代码 代码如下:

a = 0
for i = 1,6,2 do
    a = a + i
end

 

等价于

 

复制代码 代码如下:

int a = 0;
for (int i = 1; i <= 6;i += 2){ // 取到等号,如果步进是负的,那么会取 i >= 6
    a += i;
}

 

5.2 迭代器形式

迭代器形式输出一个表时,如果表中有函数,则输出的顺序及个数不确定(笔者测试得出的结果,具体原因未知)。

迭代器形式的 for 循环的实质

-- 依次返回 迭代器、状态表、迭代器初始值

 

复制代码 代码如下:

function mypairs(t)
    function iterator(t,i)
        i = i + 1
        i = t[i] and i      -- 如果 t[i] == nil 则 i = nil;否则 i = i
        return i,t[i]
    end
    return iterator,t,0
end

 

-- 一个表
t = {[1]="1",[2]="2"}

-- 迭代形式 for 语句的 等价形式

 

复制代码 代码如下:


do
local f, s, var = mypairs(t)
    while true do
        local var1, var2 = f(s, var)
        var = var1
        if var == nil then break end

 

        -- for 循环中添加的语句
        print(var1,var2)

    end
end

 

-- 迭代形式 for 语句

 

复制代码 代码如下:


for var1,var2 in mypairs(t) do
    print(var1,var2)
end

 

--> 1   1
--> 2   2
--> 1   1
--> 2   2

 

5.2.1 数组形式

 

复制代码 代码如下:

ary = {[1]=1,[2]=2,[5]=5}
for i,v in ipairs(ary) do
    print(v)                    --> 1 2
end

 

从1开始,直到数值型下标结束或者值为 nil 时结束。

5.2.2 表遍历

 

复制代码 代码如下:

table = {[1]=1,[2]=2,[5]=5}
for k,v in pairs(table) do
    print(v)                    --> 1 2 5
end

 

遍历整个表的键值对。

关于迭代器的更多内容,可参考Lua 迭代器和泛型 for。

以上所述就是本文的全部内容了,希望大家能够喜欢。

延伸 · 阅读

精彩推荐
  • LuaLua中的元方法__newindex详解

    Lua中的元方法__newindex详解

    这篇文章主要介绍了Lua中的元方法__newindex详解,本文讲解了查询与更新、监控赋值、通过table给另一个table赋值等内容,需要的朋友可以参考下 ...

    笨木头8872020-04-09
  • LuaLua中table库函数方法介绍

    Lua中table库函数方法介绍

    这篇文章主要介绍了Lua中table库函数方法介绍,本文讲解了concat、insert、maxn、remove、sort、foreachi等方法,需要的朋友可以参考下 ...

    脚本之家2502020-04-17
  • LuaLua实现__add方法重载示例

    Lua实现__add方法重载示例

    这篇文章主要介绍了Lua实现__add方法重载示例,本文直接给出实现代码,需要的朋友可以参考下 ...

    脚本之家7452020-04-24
  • LuaLua教程(二):基础知识、类型与值介绍

    Lua教程(二):基础知识、类型与值介绍

    这篇文章主要介绍了Lua教程(二):基础知识、类型与值介绍,本文讲解了Hello World程序、代码规范、全局变量、类型与值等内容,需要的朋友可以参考下 ...

    脚本之家5922020-04-28
  • LuaLua简介、编译安装教程及变量等语法介绍

    Lua简介、编译安装教程及变量等语法介绍

    这篇文章主要介绍了Lua简介、编译安装教程及变量等语法介绍,本文同时讲解了lua注释语法、Lua命令行方式等内容,需要的朋友可以参考下 ...

    junjie3632020-04-14
  • LuaLua和C语言的交互详解

    Lua和C语言的交互详解

    这篇文章主要介绍了Lua和C语言的交互详解,Lua和C语言通过栈完成交互,本文结合代码实例详细讲解了交互的方法,需要的朋友可以参考下 ...

    果冻想3702020-04-14
  • LuaLua中计算、执行字符串中Lua代码的方法

    Lua中计算、执行字符串中Lua代码的方法

    这篇文章主要介绍了Lua中计算、执行字符串中Lua代码的方法,类似JavaScript中eval函数的功能,在Lua中也可以实现,需要的朋友可以参考下 ...

    脚本之家6322020-04-30
  • Lua深入探究Lua中的解析表达式

    深入探究Lua中的解析表达式

    这篇文章主要介绍了深入探究Lua中的解析表达式,对于其语法部分的说明和示例都超详细,极力推荐此文!需要的朋友可以参考下 ...

    脚本之家3542020-05-05