浅谈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。

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

(0)

相关推荐

  • Lua教程(三):表达式和语句

    一.表达式: 1. 算术操作符:     Lua支持常规算术操作符有:二元的"+"."-"."*"."/"."^"(指数)."%"(取模),一元的"-"(负号).所有这些操作符都可用于实数.然而需要特别说明的是取模操作符(%),Lua中对该操作符的定义为:   复制代码 代码如下: a % b == a - floor(a / b) * b 由此可以推演出x % 1的

  • Lua基础教程之赋值语句、表达式、流程控制、函数学习笔记

    赋值语句 注释,单行用(--)来表示:多行用(--[[ ... ]])来标示: 定义,lua中没有定义(申明数据类型),它是通过赋值来确定其数据类型的. 赋值,是改变一个变量的值和改变表域的最基本的方法. a = "hello" .. "world" Lua可以对多个变量同时赋值,变量列表和值列表的各个元素用逗号分开,赋值语句右边的值会依次赋给左边的变量.a, b = 10, 2*x <--> a=10; b=2*x 遇到赋值语句Lua会先计算右边所有的

  • Lua中的基本语法、控制语句总结

    前言 学习一门语言,首先就是从最基本的语法开始,这一篇将对Lua中的语句进行概要的总结. 赋值 赋值的基本含义是修改一个变量或一个table中字段的值,这个和其它语言没有多少区别,但是对于Lua,有一个特性,它允许"多重赋值",也就是一下子将多个值赋予多个变量,例如以下代码: 复制代码 代码如下: local x1, x2 = 2, 4 print(x1)     -->2 print(x2)     -->4 在多重赋值中,Lua先对等号右边的所有元素求值,然后才执行赋值

  • 浅谈Lua语句

    Lua 中的语句支持赋值,控制结构,函数调用,还有变量声明. 不允许空的语句段,因此 ;; 是非法的. 1 语句组 | chuncks 复制代码 代码如下: chunck ::= {stat[';']} ([';'] 应该是表示语句组后面 ; 是可选项.) 2 语句块 | blocks 复制代码 代码如下: block ::= chunck stat ::= do block end 可以将一个语句块显式地写成语句组,可以用于控制局部变量的作用范围. 3 赋值 | assignment Lua

  • 浅谈Lua的面向对象特性

    面向对象的特性 类: 类是可扩展的模板用来创建对象,提供状态的初始值(成员变量)和行为的实现. 对象: 它是类的实例并具有分配给自己独立的内存. 继承: 它是由变量和类的函数被其他类继承的概念. 封装: 它是将数据和函数相结合的一类内的方法.数据可以在类的外部与函数的帮助下进行访问.它也被称为数据抽象. Lua的OOP 在Lua中实现面向对象与表和Lua的第一类函数.通过将函数和相关数据插入表中形成一个对象.继承可以在metatables的帮助下来实现,提供了一个查找机制不存在的函数(方法)和在

  • 浅谈sql语句中GROUP BY 和 HAVING的使用方法

    在介绍GROUP BY 和 HAVING 子句前,我们必需先讲讲sql语言中一种特殊的函数:聚合函数, 例如SUM, COUNT, MAX, AVG等.这些函数和其它函数的根本区别就是它们一般作用在多条记录上. SELECT SUM(population) FROM bbc 这里的SUM作用在所有返回记录的population字段上,结果就是该查询只返回一个结果,即所有 国家的总人口数. having是分组(group by)后的筛选条件,分组后的数据组内再筛选 where则是在分组前筛选 通过

  • 浅谈选择结构if语句和switch语句的区别

    1.选择结构if语句格式及其使用 A:if语句的格式: if(比较表达式1) { 语句体1; }else if(比较表达式2) { 语句体2; }else if(比较表达式3) { 语句体3; } ... else {   语句体n+1; } B:执行流程: 首先计算比较表达式1看其返回值是true还是false, 如果是true,就执行语句体1,if语句结束. 如果是false,接着计算比较表达式2看其返回值是true还是false, 如果是true,就执行语句体2,if语句结束. 如果是fa

  • 浅谈JavaScript变量的自动转换和语句

    JS自动类型转换 var a = 1; var b = true; "==" 表示 可以自动类型转换,比较的是数值  "===" 表示可以自动类型转换,先比较数值,再比较类型 if (a == b) { alert("相等"); //打印 }else{ alert("不等"); } 三目运算 var c = 10/2 > 4 ? 5 : 3 ; alert(c); 关于for循环 for ( var i = 0; i &

  • 浅谈Java finally语句到底是在return之前还是之后执行(必看篇)

    网上有很多人探讨Java中异常捕获机制try...catch...finally块中的finally语句是不是一定会被执行?很多人都说不是,当然他们的回答是正确的,经过我试验,至少有两种情况下finally语句是不会被执行的: (1)try语句没有被执行到,如在try语句之前就返回了,这样finally语句就不会执行,这也说明了finally语句被执行的必要而非充分条件是:相应的try语句一定被执行到. (2)在try块中有System.exit(0);这样的语句,System.exit(0);

  • 浅谈java7增强的try语句关闭资源

    java7增强的try语句关闭资源 传统的关闭资源方式 import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; class Student implements Serializable { private String name; public Student(String name)

  • Django 浅谈根据配置生成SQL语句的问题

    想要根据django中的模型和配置生成SQL语句,需要先进行一定的设置: 首先需要在你的app文件夹中进入setting.py文件,里面有一个DATABASES,进行设置数据库的配置信息: DATABASES = { 'default': { # 'ENGINE': 'django.db.backends.sqlite3', # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 'ENGINE': 'django.db.backends.mysql',

  • 浅谈pymysql查询语句中带有in时传递参数的问题

    直接给出例子说明: cs = conn.cursor() img_ids = [1,2,3] sql = "select img_url from img_url_table where id in %s" cs.execute(sql, (img_ids, )) # 直接传递元组包裹列表即可 补充知识:Python将多行数据处理成SQL语句中where条件in(' ',' ',' ')的数据 在工作中有时需要查询上万行指定的数据,就会用到SQL语句中 select * from ta

  • 浅谈mybatis中SQL语句给boolean类型赋值问题

    我就废话不多说了,大家还是直接看代码吧~ <select id="getBiTree" parameterType="String" resultMap="MenuVoListMap"> SELECT m.menu_id , m.parent_id , m.`name` , 1 opens FROM menu m WHERE m.is_valid = 1 AND (m.type = 0 or m.type = 1) and m.men

随机推荐