侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

技术  /  管理员 发布于 6年前   374

赋值语句

注释,单行用(--)来表示;多行用(--[[ ... ]])来标示;
定义,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)函数类遍历所有值。
复制代码 代码如下:
--打印数组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


  • 上一条:
    HTML5本地存储之Database Storage应用介绍
    下一条:
    HTML5本地存储之Web Storage应用介绍
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 2024.07.09日OpenAI将终止对中国等国家和地区API服务(0个评论)
    • 2024/6/9最新免费公益节点SSR/V2ray/Shadowrocket/Clash节点分享|科学上网|免费梯子(1个评论)
    • 国外服务器实现api.openai.com反代nginx配置(0个评论)
    • 2024/4/28最新免费公益节点SSR/V2ray/Shadowrocket/Clash节点分享|科学上网|免费梯子(1个评论)
    • 近期文章
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-07
    • 2017-08
    • 2017-09
    • 2018-01
    • 2018-07
    • 2018-08
    • 2018-09
    • 2018-12
    • 2019-01
    • 2019-02
    • 2019-03
    • 2019-04
    • 2019-05
    • 2019-06
    • 2019-07
    • 2019-08
    • 2019-09
    • 2019-10
    • 2019-11
    • 2019-12
    • 2020-01
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2020-10
    • 2020-11
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-03
    • 2022-04
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-12
    • 2024-02
    • 2024-04
    • 2024-05
    • 2024-06
    • 2025-02
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客