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
相关推荐
m0_7487080519 分钟前
C++中的观察者模式实战
开发语言·c++·算法
qq_5375626731 分钟前
跨语言调用C++接口
开发语言·c++·算法
wjs202442 分钟前
DOM CDATA
开发语言
Tingjct43 分钟前
【初阶数据结构-二叉树】
c语言·开发语言·数据结构·算法
猷咪1 小时前
C++基础
开发语言·c++
IT·小灰灰1 小时前
30行PHP,利用硅基流动API,网页客服瞬间上线
开发语言·人工智能·aigc·php
快点好好学习吧1 小时前
phpize 依赖 php-config 获取 PHP 信息的庖丁解牛
android·开发语言·php
秦老师Q1 小时前
php入门教程(超详细,一篇就够了!!!)
开发语言·mysql·php·db
烟锁池塘柳01 小时前
解决Google Scholar “We‘re sorry... but your computer or network may be sending automated queries.”的问题
开发语言
是誰萆微了承諾1 小时前
php 对接deepseek
android·开发语言·php