找回密码
 立即注册
查看: 186|回复: 0

Lua程序语言学习四

[复制链接]
发表于 2022-11-15 09:09 | 显示全部楼层 |阅读模式
这一章节内容:Table、模块与包这两方面的知识,至此Lua的基础语法部分就到这,下部分是Lua的面向对象,Lua的垃圾回收原理,Lua的核心与设计等,再到最后就是如何使用开源的XLua试先我们自己项目的热更功能。
9.Table

--[[
table是Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数组、字典等。
Lua table 使用关联型数组,你可以用任意类型的值来作数组的索引,但这个值不能是 nil。
Lua table是不固定大小的,你可以根据自己需要进行扩容。
Lua也是通过table来解决模块(module)、包(package)和对象(Object)的。 例如string.format表示使用"format"来索引table string。
]]--

-- Table的声明
mytable = {}

-- Table的赋值
mytable[1] = "Lua"
mytable[2] = 123
mytable[3] = 'a'

-- Table的遍历  !!!#Table如果获取的是无序的Table的话返回的值会是0,#只能获取有序长度(1,2,3,4,5)的Table
for i=1,#mytable do
    print(mytable)
end

-- Table的索引值可以是不唯一的类型,可以是整形或字符串或小数等等
mytable["123"] = "222"
print(mytable["123"])

mytable[1.1] = 2.2
print(mytable[1.1])

mytable = nil

-- 简单的 table
mytable = {}
-- 输出:mytable 的类型是  table
print("mytable 的类型是 ",type(mytable))

mytable[1]= "Lua"
mytable["wow"] = "修改前"
-- 输出:mytable 索引为 1 的元素是    Lua
print("mytable 索引为 1 的元素是 ", mytable[1])
-- 输出:mytable 索引为 wow 的元素是  修改前
print("mytable 索引为 wow 的元素是 ", mytable["wow"])

-- alternatetable和mytable的是指同一个 table
alternatetable = mytable

-- 输出:alternatetable 索引为 1 的元素是     Lua
print("alternatetable 索引为 1 的元素是 ", alternatetable[1])
-- 输出:mytable 索引为 wow 的元素是  修改前
print("mytable 索引为 wow 的元素是 ", alternatetable["wow"])

alternatetable["wow"] = "修改后"

-- 输出:mytable 索引为 wow 的元素是  修改后
print("mytable 索引为 wow 的元素是 ", mytable["wow"])

-- 释放变量
alternatetable = nil

-- 输出:alternatetable 是  nil
print("alternatetable 是 ", alternatetable)

-- mytable 仍然可以访问
-- 输出:mytable 索引为 wow 的元素是  修改后
print("mytable 索引为 wow 的元素是 ", mytable["wow"])

mytable = nil
-- 输出:mytable 是 nil
print("mytable 是 ", mytable)

-- *table.concat方法的使用
animals = {"cat", "dog", "bird"}

-- 单纯的使用table.concat(animals)的话会把表里面的所有内容全部衔接起来
-- 输出:catdogbird
print(table.concat(animals))
-- 如果只填写两个参数, 参数1 表, 参数2 分隔符
-- 输出:cat, dog, bird
print(table.concat( animals, ", "))
-- 如果参数填写满, 参数1 表, 参数2 分隔符, 参数3 表的起始遍历位置, 参数4 表的停止遍历位置
print(table.concat( animals, ", ", 2, 3))

fruits = {"banana","orange","apple"}
-- 返回 table 连接后的字符串
-- 输出:bananaorangeapple
print("连接后的字符串 ",table.concat(fruits))

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

-- 指定索引来连接 table
-- 输出:orange, apple
print("连接后的字符串 ",table.concat(fruits,", ", 2,3))

-- *我们如果只填三个参数的话会默认从起始位到表的最后一位
-- 例如:
number = {"1","2","3","4","5"}
-- 下面这两行语句的结果都是一样的,代表的一个意思
-- 输出:
-- 连接后的字符串  2,3,4,5
-- 连接后的字符串  2,3,4,5
print("连接后的字符串 ",table.concat(number, ",", 2))
print("连接后的字符串 ",table.concat(number, ",", 2, #number))

-- Table的插入和删除的方法
-- 这种写法会默认是在Table的末尾插入
table.insert(fruits,"mango")
-- 输出:索引为 4 的元素为mango
print("索引为 4 的元素为 ",fruits[4])

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

-- 输出:最后一个元素为   mango
print("最后一个元素为 ",fruits[5])
-- 把最后一个元素移除
table.remove(fruits)
-- 输出:移除后最后一个元素为nil(不存在的默认都输出为nil)
print("移除后最后一个元素为 ",fruits[5])

-- 删除Table的指定索引的值
for i=1,#fruits do
    -- 输出:
        -- banana
        -- grapes
        -- orange
        -- apple
    print(fruits)
end
print("当前剩余的:")
table.remove(fruits, 2)
for i=1,#fruits do
    -- 输出:
        -- banana
        -- orange
        -- apple
    print(fruits)
end

-- Table的排序
fruits = {"banana","orange","apple","grapes"}
print("排序前")
for k,v in ipairs(fruits) do
    -- 输出:
        -- 1    banana
        -- 2    orange
        -- 3    apple
        -- 4    grapes
    rint(k,v)
end
table.sort(fruits)
print("排序后")
for k,v in ipairs(fruits) do
    -- 输出:
        -- 1    apple
        -- 2    banana
        -- 3    grapes
        -- 4    orange
        print(k,v)
end

-- 寻找Table的最大值
--[[
    Table 最大值
    table.maxn 在 Lua5.2 之后该方法已经不存在了,我们定义了 table_maxn 方法来实现。
    以下实例演示了如何获取 table 中的最大值:
]]--
function table_maxn(t)
  local mn=nil;
  for k, v in pairs(t) do
    if(mn==nil) then
      mn=v
    end
    if mn < v then
      mn = v
    end
  end
  return mn
end
tbl = {[1] = 2, [2] = 6, [3] = 34, [26] =5}
-- 输出:tbl 最大值:34
print("tbl 最大值:", table_maxn(tbl))
-- 输出:tbl 长度:3
print("tbl 长度 ", #tbl)
--[[
    -- 注意:
    -- 当我们获取 table 的长度的时候无论是使用 # 还是 table.getn 其都会在索引中断的地方停止计数,而导致无法正确取得 table 的长度。
    -- 可以使用以下方法来代替:
    function table_leng(t)
      local leng=0
      for k, v in pairs(t) do
        leng=leng+1
      end
      return leng;
    end
]]--

word = {"a", "b", "c", "d", "e"}
function table_max(t)
    for k, v in pairs(t) do
        print(k .. "  " .. v)
    end
end
table_max(word)

function table_len(t)
    -- 注意这里一定要赋个初始值0不然会报nil错误
    local length = 0
    for k, v in pairs(t) do
        length = length + 1
    end
    return length
end
-- 输出:5
print(table_len(word))

--[[
    -- *小坑:
        -- pairs可以遍历表中所有的key,value, 可以返回nil
        -- ipairs从下标为1开始遍历,然后下标累加1,如果某个下标元素不存在就终止遍历。不一定能遍历到所有的元素
        -- 如果下标不连续或者不是从1开始的表就会中断或者遍历不到元素
]]--
local table1 = {
    [1] = '11',
    [2] = '22',
    ['GOD'] = 'love',
    [5] = '55',
}

-- table1 pairs
for k, v in pairs(table1) do
    print(k.. ' '.. v)
end

-- table1 ipairs
for k, v in ipairs(table1) do
    print(k.. ' '.. v)
end

local table1 = {
    [1] = '11',
    [2] = '22',
    ['GOD'] = 'love',
    [5] = '55',
}

-- table1 pairs
for k, v in pairs(table1) do
    -- pairs会遍历索引的key-value所以会打印出来table所有的值
    -- 不存在的值也会报nil
    -- 输出:
        -- 1 11
        -- 2 22
        -- 5 55
        -- GOD love
    print(k.. ' '.. v)
end

-- table1 ipairs
for k, v in ipairs(table1) do
    -- ipairs跟pairs不一样的是如果是不连续的或者不是从1开始遍历的
    -- 会发生中断或者遍历不到下一个元素,因为ipairs是从下标索引值为1开始遍历
    -- 输出:
        -- 1 11
        -- 2 22
    print(k.. ' '.. v)
end

-- 再看最后一道测试例子
local table2 = {
    'love',  --table默认是index递增的insert
    'is',
    [3] = 'gift',
    ['mom'] = 'love'
}

-- table2 pairs
for k, v in pairs(table2) do
    -- 输出
        -- 1 love
        -- 2 is
        -- 3 gift
        -- mom love
    print(k.. ' '.. v)
end
print('\n')
-- table2 ipairs
for k, v in ipairs(table2) do
    -- 输出
        -- 1 love
        -- 2 is
        -- 3 gift
    print(k.. ' '.. v)
end10.模块与包

--[[
-- 首先,先介绍Lua的模块
]]--
-- 一.先看下例子:
-- 先创建一个文件名为 module.lua
-- 定义一个名为 module 的模块
module = {}
-- 定义一个常量
module.constant = "这是一个常量"
-- 定义一个函数
function module.func1()
    io.write("这是一个公有函数!\n")
end
local function func2()
    print("这是一个私有函数!")
end
function module.func3()
    func2()
end
return module
-- 二.创建一个test_module.lua 文件
-- module 模块为上文提到到 module.lua
require("module")
    -- 输出
        -- 这是一个常量
        -- 这是一个公有函数!
        -- 这是一个私有函数!
print(module.constant)
module.func1()
module.func3()
print("\n")
-- test_module2.lua 文件
-- module 模块为上文提到到 module.lua
-- 别名变量 m
local m = require("module")
    -- 输出:
        -- 这是一个常量
        -- 这是一个公有函数!
        -- 这是一个私有函数!
print(m.constant)
m.func1()
m.func3()参考资料:
1.Lua table(表) | 菜鸟教程 (runoob.com)
2.Lua 5.3 参考手册 (cloudwu.github.io)
3.Lua table遍历pairs和ipairs的区别_小天使faith的专栏-CSDN博客
4.Lua local 变量的使用(简单梳理)_蚂蚁码代码-CSDN博客
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-24 20:47 , Processed in 0.087525 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表