当前位置: 首页 > 编程笔记 >

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

楚奇逸
2023-03-14
本文向大家介绍Lua基础教程之赋值语句、表达式、流程控制、函数学习笔记,包括了Lua基础教程之赋值语句、表达式、流程控制、函数学习笔记的使用技巧和注意事项,需要的朋友参考一下

赋值语句

注释,单行用(--)来表示;多行用(--[[ ... ]])来标示;
定义,lua中没有定义(申明数据类型),它是通过赋值来确定其数据类型的。
赋值,是改变一个变量的值和改变表域的最基本的方法。 a = "hello" .. "world" 

Lua可以对多个变量同时赋值,变量列表和值列表的各个元素用逗号分开,赋值语句右边的值会依次赋给左边的变量。a, b = 10, 2*x <--> a=10; b=2*x

遇到赋值语句Lua会先计算右边所有的值然后再执行赋值操作,所以我们可以这样进行交换变量的值:


x, y = y, x  -- swap 'x' for 'y' 

a[i], a[j] = a[j], a[i]  -- swap 'a[i]' for 'a[i]'

当变量个数和值的个数不一致时,Lua会一直以变量个数为基础采取以下策略:

a. 变量个数>值的个数按变量个数补足nil ;b. 变量个数<值的个数多余的值会被忽略
多值赋值经常用来交换变量,或将函数调用返回给变量: a, b = f() --f()返回两个值,第一个赋给a,第二个赋给b。

表达式

表达式---是表达式就需要运算符。

1.算术运算符:+-*/^(加减乘除幂,二元运算符),-(负值,一元运算符);操作跟C++一样
2.关系运算符:<、>、<=、>=、==、~=(不等于);这些操作符返回结果为false或者true;==和~=比较两个值,如果两个值类型不同,Lua认为两者不同;nil只和自己相等。Lua通过引用比较tables、userdata、functions。也就是说当且仅当两者表示同一个对象时相等。


print((2 < 15))   --true

print(("1" == 1)) --false

print(("2" > "15")) --true

a={};a.x=1;a.y=0;

b={};b.x=1;b.y=0;

print((a ~= b)); --true

c = a;

print((a == c)); --true

--Lua比较数字按传统的数字大小进行,比较字符串按字母的顺序进行,但是字母顺序依赖于本地环境。

--为了避免不一致的结果,混合比较数字和字符串,Lua会报错,比如:2 < "15"

3.逻辑运算符:and、or、not;逻辑运算符认为false和nil是假(false),其他为真,0也是true.
and和or的运算结果不是true和false,而是和它的两个操作数相关。a and b -- 如果a为false,则返回a,否则返回b ;a or b -- 如果a为true,则返回a,否则返回b ;想想堆栈,若第一个变量就可以判断出真假,就不需要判断第二个变量了。

and的优先级比or高。

C语言中的三元运算符,a ? b : c  ==>>在Lua中可以这样实现: (a and b) or c
not的结果一直返回false或者true


print(not nil) --> true 

print(not false) --> true 

print(not 0) --> false 

print(not not nil) --> false 

4.连接运算符:.. (两个点);如果操作数为数字,Lua将数字转成字符串。


print("Hello " .. "World") --> Hello World 

print(0 .. 1) --> 01 

流程控制

控制结构的条件表达式结果可以是任何值,Lua认为false和nil为假,其他值为真。
do..end(相当于c/c++的{})

if语句,有三种形式


if conditions then

    then-part

end;

if conditions then

   then-part

else

   else-part

end;

if conditions then

   then-part

elseif conditions then

    elseif-part

   .. --->多个elseif

else

   else-part

end;

由于Lua不支持switch语句,所以这种一连串的if-else if代码很常见的。

while语句


while condition do

   statements;

end;

repeat-until语句


repeat

  statements;

until conditions;

条件判断是在循环体之后做的,因此循环体至少会执行一次。类似于C++中的,do..while()

for语句

数字型for(number for)


for var=exp1,exp2,exp3 do

    loop-part

end

--for将用exp3作为step从exp1(初始值)到exp2(终止值),执行loop-part。其中exp3可以省略,默认step=1

泛型for(generic for),泛型for循环通过一个迭代器(iterator)html" target="_blank">函数类遍历所有值。


--打印数组a的所有值

for i,v in ipairs(a) do print(v) end

Lua的基础库提供了ipairs,这是一个用于遍历数组的迭代器函数。在每次循环中,i会被赋予一个索引值,同时v被赋予一个对应该索引的数组元素值。


再看一个遍历表key的例子: 

-- print all keys of table 't' 

--for k in pairs(t) do print(k) end 

 

days = {"Sunday", "Monday", "Tuesday", "Wednesday","Thursday", "Friday", "Saturday"}

revDays = {}

for i,v in pairs(days) do

revDays[v] = i  --revDays = {["Sunday"] = 1, ["Monday"] = 2,["Tuesday"] = 3, ["Wednesday"] = 4,["Thursday"] = 5, ["Friday"] = 6,["Saturday"] = 7}

end

--x = "Tuesday"

--print(revDays[x])--3

for k in pairs(days) do print(k) end --1234567 for k in pairs(revDays) do print(k) end

标准库提供了几种迭代器,包括用于迭代文件中每行的(io.lines)、迭代table元素的(pairs)、迭代数组元素的(ipairs)、迭代字符串中单词的(string.gmatch)等。

break和return语句

函数


function foo(a, b, c)

   local sum = a + b

   return sum, c --函数可以返回多个值

end

r1, r2 = foo(1, '123', 'hello') --平行赋值

print(r1, r2) --124 hello

函数定义:用关键字function定义函数,以关键字end结束
局部变量:用关键字local定义。如果没有用local定义,即使在函数内部定义的变量也是全局变量!
函数可以返回多个值:return a, b, c, ...
平行赋值:a, b = c, d
全局变量:前面的代码定义了三个全局变量:foo、r1和r2

 类似资料:
  • 本文向大家介绍Lua基础教程之表(Table)学习笔记,包括了Lua基础教程之表(Table)学习笔记的使用技巧和注意事项,需要的朋友参考一下 表 定义表(Table)的方式:a = {}, b = {…} 访问表的成员:通过“.”或者“[]”运算符来访问表的成员。注意:表达式a.b等价于a[“b”],但不等价于a[b] 表项的键和值:任何类型的变量,除了nil,都可以做为表项的键。从简单的数值、

  • 本文向大家介绍AngularJS基础学习笔记之表达式,包括了AngularJS基础学习笔记之表达式的使用技巧和注意事项,需要的朋友参考一下 AngularJS通过表达式将数据绑定到HTML。 AngularJS表达式   AngularJS表达式写在双大括号中:{{ 表达式语句 }}。   AngularJS表达式绑定数据到HTML的方式与ng-bind指令的方式相同。   AngularJS会准

  • 控制流程语句用于控制程序按照一定流程来执行。 if-then 它告诉你要只有 if 后面是 true 时才执行特定的代码。 void applyBrakes() { // the "if" clause: bicycle must be moving if (isMoving){ // the "then" clause: decrease current spee

  • 本文向大家介绍Django学习笔记之ORM基础教程,包括了Django学习笔记之ORM基础教程的使用技巧和注意事项,需要的朋友参考一下 ORM简介 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据

  • JavaScript中有一种语句叫做流控制语句,它能控制语句的开始、结束,控制程序的运行。 if语句 if语句是常用的一种控制语句,它的格式是: if (表达式) {语句1} else {语句2} 其中,表达式的值不一定是布尔值,JavaScript的Boolean()会将表达式转换成布尔值,若转换成的布尔值结果为true,则执行语句1,相反,若布尔值为false,则执行语句2. var a =

  • 本文向大家介绍AngularJS基础学习笔记之控制器,包括了AngularJS基础学习笔记之控制器的使用技巧和注意事项,需要的朋友参考一下 AngularJS控制器用来控制AngularJS applications的数据。   AngularJS控制器就是普通的JavaScript对象。 AngularJS控制器   AngularJS applications通过控制器进行控制。   ng-c