Lua语言入门(自用)

全局与非全局

在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做铺垫

相关推荐
Scott9999HH3 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
码智社4 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海4 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖5 小时前
JDK 26 新特性详解
java·开发语言
马优晨5 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区7 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大8 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai8 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
এ慕ོ冬℘゜8 小时前
前端基础:什么是时间戳?JS获取时间戳三种方法与实战用途
开发语言·前端·javascript
执明wa8 小时前
LayoutInflater详解: XML是如何变成View的?
android·xml·开发语言·android studio