全局与非全局
在lua语言当中没有被local表示的是全局变量
反之则是本地变量(仅仅作用在某个文件,函数,或者代码块)
下面是实例代码和运行结果
Lua
--hello.lua
A = 10;--这样就是全局变量,然后这个编译器如果是大写就是默认的全局变量
local b = 3;--这样就是局部变量
--reference.lua
require('hello')--这里面的require就相当于Python里面的import或者c++当中的include
print(A);--这个按照原来的脚本打印10
print(b);--这样会打印nil
变量类型
Lua当中没有像我们以前学过的众多语言清晰可见,在Lua当中任何的数值,比如int,long ing,short int 在Lua当中都是用number这个变量来表示的
然后string都是差不多的,具体的实现请参考官方文档
最后就是table类型我个人认为是最具特色的类型,放到后面详细讲解
下面是代码演示:
Lua
A = 1.131
B = 200
C = 1.251254121
print(type(A),type(B),type(C))

字符串类型
字符串类型可以通过许多种方式来定义,下面是代码实例:
Lua
local a = 'string1'
local b = "string2"
local c = [[
yes \n dsadq
sdaw
]]
print(a,b,c)

在Lua当中字符串一旦创建就不可变,如何理解:
str有一个对象是"Hello"
过了几个星期,str玩腻了又想找"World",这个时候str就会和"World"在一起而"Hello"一个人站在原地,所以没有变
Lua
local str = "Hello"
str = str .. " World" -- 拼接字符串,生成一个新的字符串
print(str) -- 输出: Hello World
此外可以通过"#"的方式查看字符串的长度
Lua
S = "456"
print(#S) --返回的值是3
最后就是string.的一些相关函数,其实和其他的语言差不多这里就不多讲解啦
函数
1. 函数的定义
Lua 中的函数可以通过以下方式定义:
-
普通函数 :使用
function
关键字。 -
匿名函数 :使用
function
关键字但不指定函数名。 -
表方法:将函数作为表的成员。
Lua
-- 普通函数
function add(a, b)
return a + b
end
-- 匿名函数
local multiply = function(a, b)
return a * b
end
-- 表方法
local mathUtils = {
add = add,
multiply = multiply
}
2. 函数的调用
-
函数可以通过函数名加括号的方式调用。
-
如果函数没有参数,也必须加上括号(除非是单参数且为字符串或表)。
Lua
local result1 = add(1, 2) -- 调用普通函数
local result2 = multiply(3, 4) -- 调用匿名函数
local result3 = mathUtils.add(5, 6) -- 调用表方法
3. 函数的参数
-
Lua 函数的参数是按值传递的(对于表、函数等引用类型,传递的是引用)。
-
Lua 函数支持可变参数 (Varargs),使用
...
表示。
Lua
function sum(...)
local result = 0
for i, v in ipairs({...}) do
result = result + v
end
return result
end
print(sum(1, 2, 3, 4)) -- 输出: 10
4. 函数的返回值
-
Lua 函数可以返回多个值。
-
如果函数没有显式返回值,默认返回
nil
。
Lua
function swap(a, b)
return b, a
end
local x, y = swap(1, 2)
print(x, y) -- 输出: 2 1
5. 匿名函数与高阶函数
-
Lua 支持匿名函数(Lambda 表达式),可以作为参数传递给其他函数。
-
高阶函数是指接受函数作为参数或返回函数的函数。
Lua
-- 高阶函数
function apply(func, a, b)
return func(a, b)
end
-- 匿名函数作为参数
local result = apply(function(a, b) return a + b end, 3, 4)
print(result) -- 输出: 7
6. 闭包(Closure)个人认为非常优雅
-
Lua 支持闭包,即函数可以捕获并访问其外部作用域的变量。
-
闭包在回调函数、延迟计算等场景中非常有用。
Lua
function createCounter()
local count = 0
return function()
count = count + 1
return count
end
end
local counter = createCounter()
print(counter()) -- 输出: 1
print(counter()) -- 输出: 2
7. 函数与表
-
函数可以作为表的成员(方法)。
-
Lua 提供了一种特殊的语法糖
:
,用于定义和调用表方法(自动传递self
参数),在显示项目中经常用到,我感觉和类很像但是不确定,具体的要之后参与实际项目实践看看。
示例
Lua
local person = {
name = "Alice",
greet = function(self)
print("Hello, " .. self.name)
end
}
-- 使用 : 语法糖
function person:shout()
print(self.name .. " is shouting!")
end
person:greet() -- 输出: Hello, Alice
person:shout() -- 输出: Alice is shouting!
表
表分为两种,一种全局表,和一种常规表
先说常规的表,就是自己定义的表,在表中可以存放所有的数据结构,函数也可以上面也有提
示例代码:
Lua
T = {1,'231515',function (a,b)
return a,b;
end}
再就是表的一些相关函数,和其他语言中的链表差不多:
Lua
table.insert(T, "d")--默认是在最后一个位置插入的
print(T[4])
table.insert(T, 2, "Insert in to")--这个是指定区域插入如果插入就是将后面所有的都向后移动一个
print(T[2])
table.remove(T, 2) --移除table表中的一个东西
print(T[2])
--很明显这个时候就不是上面那个了
local removed = table.remove(T, 1)--table还可以保存删除后的数据
print(removed)
全局表就是_G,这个表的作用就是将所有的全局变量都放在这个里面,所以我们就可以表里面调用表
Lua
U = {
a = 1,
b = 2,
c = '3',
e = function ()
print("im e")
end,
['sda.,;'] = '鬼东西'
}
print(U.e())--这里注意了,如果是要调用table表中的函数的话就需要添加()才行,不然就是返回它的地址了
--除此之外还可以自行添加
U["abc"] = 123
print(U['abc'])--这样是可行的
--如果我们定义变量的东西不是字母而是非常诡异的东西,那么我们就可以用[]来包括进去
print(U['sda.,;']) --展示好像不能打印UTF-8,奇怪
-- _G所有的全局变量都包含在_G里面
print(_G.A)
-- 同理可得,由于我们没有给上面的U这个table变成全局变量,所以他也包含在_G里面
print(_G.U['sda.,;'])
循环和条件语句
if语句和python的更加接近一点
Lua
local a = 10
local b = 20
if a > b then
print("yes")
elseif a == b then
print("no")
else
print(a)
end
while循环:
Lua
local i = 0
while true do
i = i + 1 -- 注意在Lua里面没有i+=1这种操作
if i == 6 then
break
end
print(i)
end
--结果
1
2
3
4
5
for循环:
Lua
for i = 1, 10, 1 do
print(i)
end
还有值得注意的一点是在Lua当中0表示的是True
Lua
if 0 then
print('yes')
else
print('false')
end
总结
到这里八成的Lua代码都可以写了,由于这个学期刚刚在UE项目实习,以后也会分享unlua项目的经验和心得,这次的Lua也是为了后面的做unlua做铺垫