Lua 实用逻辑片段(2024)

----------------------------------------------

------------------简单模型-----------------
--读
local file1=io.input("1.txt")  --当前目录"1.txt"要存在,不然出错
local str=io.read("*a")
print(str)
--写
local file2=io.output("2.txt") --当前目录"2.txt"不需要存在
io.write(str)
io.flush()
io.close()

------------------完整模型-----------------
local f=io.open("3.txt","a+")
f:write("Happy New Year!")
f:flush()

f:seek("end",-1) --定位到文件末尾前一个字节
local str=f:read(1) --读取一个字符
print(str) --输出"!"
f:close()

-----------------------------------------------

lua 中 . 和 : 的区别
首先在lua中使用“:”定义的函数会自动传入一个名为self的变量,这个变量是隐含的,self同c++中的this一样,表示当前对象的指针:而“.”定义的函数中没有self。

  function  class:func2( )  end
  function  class.func1(self)  end
  --这时候这两个函数等价
function MainScene:ctor()
    self:ceshi(1,2,3)
end
function MainScene:ceshi(a,b,c)
    print(a,b,c)
end
--输出:1 2 3

分析:默认传self,默认接受self。

function MainScene:ctor()
    self:ceshi(1,2,3)
end
function MainScene.ceshi(a,b,c)  --注意是.
    print(a,b,c)
end
--输出:userdata 1 2

分析:调用ceshi函数用的:默认传递self为第一个参数,但函数声明时候用的 . 所以不会有默认隐藏的self去接收,此时传递参数为 self 1 2 3 但是ceshi函数只接收3个参数所以3被抛弃。

function MainScene:ctor()
    self.ceshi(1,2,3)  --注意是.
end
function MainScene.ceshi(a,b,c)  --注意是.
    print(a,b,c)
end
--输出:1 2 3

分析:默认不传递self,默认不接受self

function MainScene:ctor()
    self.ceshi(1,2,3) --注意是.
end
 
function MainScene:ceshi(a,b,c)
    print(self)
    print(a,b,c)
end
--输出:1
--     2 3 nil

分析:函数调用时用的 . 不会传递self 只传递1 2 3,而ceshi函数声明时用的 : 默认有一个self在第一位去接收,ceshi函数能接收4个参数,即 self a b c ,所以c没有接收参数为nil。

-------------------------------------------------

如果需要存储同一个键的多个值,可以采用以下方式:

1. 使用嵌套的 table 存储多个值

通过将键对应的值设置为一个嵌套的 table,可以存储多个值。

示例代码:
local t = {}

-- 为同一个键 "key1" 添加多个值
t["key1"] = { "value1", "value2", "value3" }

-- 遍历并打印该键的所有值
for _, v in ipairs(t["key1"]) do
    print(v)
end
输出:
value1
value2
value3
说明:
  • t["key1"] 是一个嵌套 table,用来存储多个值。
  • 遍历时使用 ipairs 获取每个值。

2. 使用数字索引存储多个值

可以用 table 的数字索引来存储多个相同键的值。

示例代码:

local t = {}

-- 为键 "key1" 添加多个值
t["key1"] = {}
table.insert(t["key1"], "value1")
table.insert(t["key1"], "value2")
table.insert(t["key1"], "value3")

-- 遍历并打印该键的所有值
for _, v in ipairs(t["key1"]) do
    print(v)
end
输出:

value1
value2
value3

说明:
  • table.insert 是 Lua 的内置函数,用于向表中插入值。
  • t["key1"] 是一个列表(数组形式),用来存储多个值。

3. 使用多层次键结构

如果需要针对同一个键存储与不同条件相关的多个值,可以使用多层次键(例如子键)。

示例代码:

local t = {}

-- 为键 "key1" 添加多个条件对应的值
t["key1"] = {}
t["key1"]["condition1"] = "value1"
t["key1"]["condition2"] = "value2"
t["key1"]["condition3"] = "value3"

-- 打印不同条件下的值
print(t["key1"]["condition1"]) -- 输出 value1
print(t["key1"]["condition2"]) -- 输出 value2
print(t["key1"]["condition3"]) -- 输出 value3
输出:

value1
value2
value3

说明:
  • t["key1"] 的基础上,再嵌套一层子键 condition1condition2 等,用于区分不同的值。

4. 使用 table 序号区分

可以通过设置键的值为多个表项(包含键和对应的值),实现存储同一个键的多个值。

示例代码:

local t = {}

-- 使用多个表项存储键值对
t[1] = { key = "key1", value = "value1" }
t[2] = { key = "key1", value = "value2" }
t[3] = { key = "key1", value = "value3" }

-- 遍历并打印所有值
for _, pair in ipairs(t) do
    if pair.key == "key1" then
        print(pair.value)
    end
end
输出:

value1
value2
value3

说明:
  • 每个表项都是一个 table,包含 keyvalue 字段。
  • 可以使用循环遍历表并按键名查找值。

5. 自定义存储方式

如果需要对键值的存储有特殊需求,例如多种关联结构,可以设计自定义的存储逻辑。例如:

示例代码:

local t = {}

-- 自定义插入函数
function addValue(table, key, value)
    if not table[key] then
        table[key] = {}
    end
    table.insert(table[key], value)
end

-- 自定义获取函数
function getValues(table, key)
    return table[key] or {}
end

-- 添加多个值
addValue(t, "key1", "value1")
addValue(t, "key1", "value2")
addValue(t, "key1", "value3")

-- 获取并打印
local values = getValues(t, "key1")
for _, v in ipairs(values) do
    print(v)
end
输出:

value1
value2
value3

总结

在 Lua 中实现存储同一个键的多个值时,可以选择以下方式:

  1. 嵌套表存储: 使用嵌套的 table 存储多个值(推荐)。
  2. 数字索引存储: 为键关联一个数组,用数字索引存储多个值。
  3. 多层次键结构: 将值与特定条件关联,通过多层次键存储。
  4. 序号区分: 将键值对存储为一个列表的多个表项。
  5. 自定义逻辑: 使用函数封装插入和读取操作,适合复杂需求。

local t = {}

-- 自定义插入函数
function addValue(table, key, value)
    if not table[key] then
        table[key] = {}
    end
    table.insert(table[key], value)
end

-- 自定义获取函数
function getValues(table, key)
    return table[key] or {}
end

-- 添加多个值
addValue(t, "key1", "value1")
addValue(t, "key1", "value2")
addValue(t, "key1", "value3")

addValue(t, "key2", "valueA")
addValue(t, "key2", "valueB")

-- 获取并打印所有键值对
for key, values in pairs(t) do
    for _, v in ipairs(values) do
        print("Key: " .. key .. ", Value: " .. v)
    end
end
 

-------------------------------------------------

支持动态颜色和复杂消息格式

-- 引入Unity的Debug模块
local Debug = CS.UnityEngine.Debug

-- 定义一个函数,支持预设颜色名和自定义RGB颜色值的日志输出
function logColorMessage(colorInput, customMessage)
    -- 如果没有提供日志内容,设置默认值
    customMessage = customMessage or "Default Log Message"

    -- 定义预设颜色名的映射表
    local colorMap = {
        red = "#FF0000",
        green = "#00FF00",
        blue = "#0000FF",
        white = "#FFFFFF" -- 默认颜色
    }

    -- 判断输入的颜色是预设颜色名还是自定义RGB值
    local customColor = colorMap[colorInput] or colorInput -- 如果是预设颜色名,则使用映射值;否则直接使用自定义值

    -- 如果没有颜色输入或输入无效,使用白色
    if not customColor or customColor == "" then
        customColor = "#FFFFFF"
    end

    -- 输出日志,支持动态颜色
    Debug.Log("<color=" .. customColor .. ">" .. customMessage .. "</color>")
end

-- 示例调用
logColorMessage("red", "This is a predefined red log!")    -- 输出预设红色日志
logColorMessage("green", "This is a predefined green log!") -- 输出预设绿色日志
logColorMessage("blue", "This is a predefined blue log!")   -- 输出预设蓝色日志
logColorMessage("#FFA500", "This is a custom orange log!")  -- 输出自定义橙色日志
logColorMessage("#0000FF", "This is a custom blue log!")    -- 输出自定义蓝色日志
logColorMessage(nil, "This is a default log!")              -- 输出默认白色日志
logColorMessage("yellow", "This is an unknown color log!")  -- 输出白色日志(默认颜色)
 

-- 定义预设颜色名的映射表

    local colorMap = {

        red = "#FF0000", -- 红色

        green = "#00FF00", -- 绿色

        blue = "#0000FF", -- 蓝色

        yellow = "#FFFF00", -- 黄色

        purple = "#800080", -- 紫色

        orange = "#FFA500", -- 橙色

        pink = "#FFC0CB", -- 粉红色

        brown = "#A52A2A", -- 棕色

        cyan = "#00FFFF", -- 青色

        gray = "#808080", -- 灰色

        white = "#FFFFFF" -- 默认颜色

    }

-------------------------------------------------

-------------------------------------------------

-------------------------------------------------

-------------------------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值