lua学习(一)

lua学习(一)

版本:5.3

官方文档:lua在线文档

在线编辑器:luaos在线模拟

介绍

Lua 是一种轻量级、可扩展的脚本语言,设计目标是为了嵌入到其他应用程序中,以提供灵活的脚本功能。

特点

  • 简洁易学的语法:Lua 的语法简洁明了,易于学习和掌握。它采用类似 C 语言的语法风格,但更加简洁和灵活。

  • 高效的执行速度:Lua 是一种解释型语言,但它的执行速度非常快。这得益于其高效的虚拟机和优化的编译器。

  • 可扩展性强:Lua 可以很容易地与其他语言进行集成,并且可以通过编写 C 或 C++ 扩展来增强其功能。

  • 轻量级:Lua 占用的内存空间非常小,适合在资源受限的环境中使用。

  • 跨平台性:Lua 可以在多种操作系统上运行,包括 Windows、Linux、macOS 等。

基础语法

变量

Lua 中的变量无需声明类型,可以直接赋值。变量名由字母、数字和下划线组成,但不能以数字开头。

lua 复制代码
a = 10  // 不用声明类型
b = "Hello"
c = true

变量作用域:

lua的变量默认是全局,一处定义,所有模块都可以使用,所以需要严格使用local关键字来修饰,使其成为局部变量。

lua 复制代码
a = 10  // 全局变量
local b = 10  // 局部变量

数据类型

  • number:包括整数和浮点数,所有数字都是双精度浮点数(它可以表示十进制的15或16位有效数字,其可以表示的数字的绝对值范围大约是:-1.79E+308 ~ +1.79E+308)

  • 字符串string

  • 表Table:一般用于表达数组和表,表内除了nil,可以存储其他几种不同的数据类型,可以同时存储不同类型

  • 函数function

  • 自定义类型userdata:分为完全用户数据(一块由 Lua 管理的内存对应的对象),轻量用户数据(指一个简单的 C 指针)。用户数据在 Lua 中除了赋值与相等性判断之外没有其他预定义的操作。

  • 线程thread:与操作系统的线程无关,只是一个独立的执行序列,被用于实现协程 。

  • nil:无效值,如果一个变量没有声明就调用,则返回该类型

Table(重点)

  • 可以用任意类型的值来作数组的索引,但这个值不能是 nil

  • 当使用Table作为数组时,其下标是以1为起始

  • 作为表使用时,其key值是字符串类型

lua 复制代码
a = {}
-- 当使用Table作为数组,可以通过insert插入数据
table.insert(a, 1)  -- 效果类似python的append
table.insert(a, 2)
table.insert(a, 2, 3)  --效果是在下表2的位置插入3
print(a[1])  --访问下标1的数据,该用例打印1

-- Table作为表来使用时
b = {}
b["aaa"] = 1
-- 方式二
b = {
  a=1,
  b=2,
  ["insd"]=3
}
Table连接
lua 复制代码
fruits = {"banana","orange","apple"}
-- 返回 table 连接后的字符串
print("连接后的字符串 ",table.concat(fruits))
--连接后的字符串     bananaorangeapple

-- 指定连接字符
print("连接后的字符串 ",table.concat(fruits,", "))
-- 连接后的字符串     banana, orange, apple

-- 指定索引来连接 table
print("连接后的字符串 ",table.concat(fruits,", ", 2,3))
--连接后的字符串     orange, apple
插入和删除
lua 复制代码
fruits = {"banana","orange","apple"}

-- 在末尾插入
table.insert(fruits,"mango")
print("索引为 4 的元素为 ",fruits[4])
-- 索引为 4 的元素为     mango

-- 在索引为 2 的键处插入
table.insert(fruits,2,"grapes")
print("索引为 2 的元素为 ",fruits[2])
--索引为 2 的元素为     grapes

print("最后一个元素为 ",fruits[5])
--最后一个元素为     mango

table.remove(fruits)
print("移除后最后一个元素为 ",fruits[5])
--移除后最后一个元素为     nil

元表Metatable

用来定制Table的行为,比如通过重写元方法__add,实现两个Table相加

元表常见用法
  • 设置元表:
lua 复制代码
mytable = {}                          -- 普通表 
mymetatable = {}                      -- 元表
setmetatable(mytable,mymetatable)     -- 把 mymetatable 设为 mytable 的元表
常用元方法
lua 复制代码
__index -- 通过键来访问 table 的时候,如果这个键没有值,那么Lua就会寻找该table的metatable(假定有metatable)中的__index 键。如果__index包含一个表格,Lua会在表格中查找相应的键。
-- __index用例
other = { foo = 3 } 
t = setmetatable({}, { __index = other }) 
print(t.foo)
print(t.bar)

-- 设置__index为function
mytable = setmetatable({key1 = "value1"}, {
  __index = function(mytable, key)
    if key == "key2" then
      return "metatablevalue"
    else
      return nil
    end
  end
})

print(mytable.key1,mytable.key2)

设置的是函数时,执行的过程:

  • mytable 表赋值为 {key1 = "value1"}

  • mytable 设置了元表,元方法为 __index。

  • 在mytable表中查找 key1,如果找到,返回该元素,找不到则继续。

  • 在mytable表中查找 key2,如果找到,返回 metatablevalue,找不到则继续。

  • 判断元表有没有__index方法,如果__index方法是一个函数,则调用该函数。

  • 元方法中查看是否传入 "key2" 键的参数(mytable.key2已设置),如果传入 "key2" 参数返回 "metatablevalue",否则返回 mytable 对应的键值。

lua 复制代码
-- 自定义计算表中最大键值函数 table_maxn,即返回表最大键值
function table_maxn(t)
    local mn = 0
    for k, _ in pairs(t) do
        if type(k) == "number" and k > mn then
            mn = k
        end
    end
    return mn
end

-- 两表相加操作
mytable = setmetatable({ 1, 2, 3 }, {
  __add = function(mytable, newtable)
    local max_key_mytable = table_maxn(mytable)
    for i = 1, table_maxn(newtable) do
      table.insert(mytable, max_key_mytable + i, newtable[i])
    end
    return mytable
  end
})

secondtable = {4, 5, 6}

mytable = mytable + secondtable

for k, v in ipairs(mytable) do
    print(k, v)
end
lua 复制代码
-- 用来对表更新。当你给表的一个缺少的索引赋值,解释器就会查找__newindex 元方法:如果存在则调用这个函数而不进行赋值操作。

循环

for

数值循环
lua 复制代码
for i = 起始值, 结束值, 间隔值 do
    -- statements
end

for i = 0, 10, 2 do // 从0开始,每次间隔2,遍历到10结束
    -- statements
end

for i = 0, 10 do
    -- statements
end

间隔值为1的时候可以省略。

迭代循环

遍历表

lua 复制代码
tb = {["a"] = "hello", ["b"] = 2}
for k,v in pairs(tb) do
    print(k, v)
end
相关推荐
Y_3_737 分钟前
30 分钟从零开始入门 CSS
开发语言·前端·css·人工智能·python·tensorflow
IT、木易42 分钟前
大白话css第二章深入学习
前端·css·学习
fanged1 小时前
CMake小结2(PICO为例)
学习·嵌入式
weixin_399264292 小时前
QT C++ QtConcurrent::run 异步任务 简单例子
开发语言·c++
东方忘忧2 小时前
QT MD5校验文件和数据的完整性
开发语言·qt
nqqcat~2 小时前
C语言机试编程题
c语言·开发语言·考研·算法
tnnnnt2 小时前
今天锐评一下C#
开发语言·c#
Knock man3 小时前
C++ 文件操作
开发语言·c++
m0_dawn3 小时前
Python 3.11 69 个内置函数(完整版)
开发语言·python·数据分析
Matlab仿真实验室3 小时前
基于Matlab实现倒立摆仿真程序
开发语言·matlab·倒立摆仿真程序