Lua语言初识

本文介绍了Lua语言的基础知识,包括数据类型如空类型nil、布尔类型、数值类型、字符串以及表。还讲解了函数定义、变量的使用,特别是局部变量的声明(使用local关键字)。此外,文章提到了Lua中的for循环语句以及内建函数,并指出Lua可以与C函数互调。对于想学习或深入了解Lua的读者,提供了两个参考链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

近期项目需要,研究openresty,开始学习Lua,对Lua常用的语法进行一个简单总结


数据类型

空类型

nil

所有未赋值的变量都为nil


布尔类型

true/false

nil和false均为false,其它值为true。这点与C/C++不同,C/C++中的0也是false


数值类型

所有的整数和浮点数都为数值类型


字符串(string)

可以使用双引号,单引号或[[]]来定义字符串,字符串拼接使用..,如:

local a = "aaa"
local b = 'bbb'
local c = [["aaa",'bb']]
print(a)
print(b)
print(c)
print(a.."~="..b)

运行结果

D:\My Work\lua>lua53 string.lua
aaa
bbb
"aaa",'bb'
aaa~=bbb

D:\My Work\lua>


表(table)

lua的表分为两种,一种为数组,一种为映射,对表中的类型,不要求一致

<pre name="code" class="plain">

--数组:
ta = {1, 2, "Hello"}
--映射:
tb = {
["Hello"] = "world",
[1] = "Hello"
}


print("数组")
for k, v in ipairs(ta) do
print(k, v)
end
print("映射")
for k, v in pairs(tb) do
print(k, v)
end
 

运行结果

D:\My Work\lua>lua53 string.lua
数组
1       1
2       2
3       Hello
映射
1       Hello
Hello   world

D:\My Work\lua>

与C/C++/java不同,Lua的数组是从1开始索引的,映射则是按照Hash进行索引

函数

函数有两种定义方式,第二种方式有点像Python的Lamda

function foo(a, b)
    表达式
end

foo = function(a, b)
    表达式
end

变量

Lua是弱类型语言,变量不需要声明类型的,但赋值后可以使用type查看变量的类型,变量可以赋值为上面类型中的任意类型

a = 1
b = 1.1
c = "test"

foo = function(c)
	print("Hello "..c)
end
print(type(a))
print(type(b))
print(type(c))
print(type(d))
print(type(foo))
运行结果

D:\My Work\lua>lua53 string.lua
number
number
string
nil
function

D:\My Work\lua>


变量默认为全局,如果要将变量定为局部变量,需要在变量前加上local。加上local的好处,Lua解释器在执行时会对local变量进行优化

function fa()
	a = 10
	print("in fa a is "..a)
end

function fb()
	local b = 11
	print("in fb b is "..b)
end

fa()
fb()
print("outside a is "..a)
print("outside b is "..b)
运行结果

D:\My Work\lua>lua53 string.lua
in fa a is 10
in fb b is 11
outside a is 10
lua53: string.lua:14: attempt to concatenate a nil value (global 'b')
stack traceback:
        string.lua:14: in main chunk
        [C]: in ?

D:\My Work\lua>
以上可见,被local修斯的b在外面就是一个nil

table和string类型处理

对table和string,lua提供了一些操作函数,使用下面代码可以查看,具体参数可以自行baidu

print("table内置函数")
for k, v in pairs(table) do
	print(k, v)
end
print("string内置函数")
for k, v in pairs(string) do
	print(k, v)
end
运行结果

D:\My Work\lua>lua53 string.lua
table内置函数
remove  function: 62995270
pack    function: 629945c0
unpack  function: 62995120
insert  function: 62994f90
concat  function: 62994df0
move    function: 62994330
sort    function: 62995430
string内置函数
upper   function: 6299d440
dump    function: 6299f3c0
gmatch  function: 6299db30
rep     function: 6299d560
lower   function: 6299d730
gsub    function: 6299fd00
find    function: 6299fcf0
unpack  function: 6299e880
byte    function: 6299cf90
packsize        function: 6299e750
char    function: 6299dbc0
pack    function: 6299ebd0
sub     function: 6299d280
reverse function: 6299d4d0
match   function: 6299fce0
len     function: 6299cde0
format  function: 6299dcf0

D:\My Work\lua>

控制语句
if语句

if 条件 then
    表达式
elseif 条件 then
    表达式
else
    表达式
end

while语句

while 条件 do
    表达式
end

for语句1

for语句1类似于C/C++中的for

for i=起始, 结束[, 步进] do
    表达式
end
起始为i的初值,结束为i的结束值,步进为i每次增加值,不填默认每次加1,填写i则按步进数增长,如果从后往前轮询,只需把步进设置为负数

注意,这里的起始和结束值都会执行,直到i大于结束或小于结束才会退出


for语句2

for语句2类似于python中的for

for k, v in pairs(table变量) do
    表达式
end

一些内建函数

print  打印
pairs  Hash迭代,能迭代Table所有元素
ipairs 数组迭代,只能按顺序迭代key为数值的Table,遇到值为nil结束
type   查看变量类型
tonumber     将字符串转为数值
tostring        将数值转为字符串
dofile("foo.lua")   引入foo.lua包
require("foo")     引入foo.lua包,require只会引入一次,dofile会引入多次

运算符
算数运算符
+:加
-:减
*:乘
/:除
^:指数
%:取模
注意:Lua的算数运算符中没有++,--,+=之类的运算符

关系运算符
<:小于
>:大于
<=:小于等于
>=:大于等于
==:等于
~=:不等于
注意:不等于与其他语言有区别,不是!=

逻辑运算符
and:与
or:或
not:非

其它运算符
..:字符串连接
#:对字符串来说是字符串的大小,对于table来说,是table元素个数,如:
a="hello world"
print(#a)
b = {1, 2, 3}
print(#b)
运行结果
D:\My Work\lua>lua53 string.lua
11
3

D:\My Work\lua>


以上为Lua常用的基本语法,Lua另外还可以与C函数互相调用,下面会进行研究

对Lua深入学习,可参考:

http://www.lua.org/pil/contents.html

http://moonbingbing.gitbooks.io/openresty-best-practices/content/index.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值