用户名  找回密码
 立即注册
    查看: 125|回复: 1

    【浮生梦】Lua系统函数 第二课 基础函数讲解

    [复制链接]

    321

    主题

    66

    回帖

    1447

    积分

    积分
    1447
    发表于 2025-5-18 23:17:30 | 显示全部楼层 |阅读模式

    课程内容

    这节课主要讲解了Lua编程语言中的一些基础函数和特性,包括loadloadfilepcallxpcallselectsetmetatabletostringtonumber等函数的使用方法和注意事项。以下是这节课的详细总结:

    一、loadloadfile 函数

    1. load 函数

      • 功能:将一个字符串作为代码块加载并返回一个可执行函数。
      • 参数
        • 必选参数:代码块(字符串)。
        • 可选参数:函数名、代码块名称、文本/二进制模式。
      • 注意事项
        • 如果字符串中包含双引号,可能会导致解析错误,建议使用单引号。
        • 使用时需谨慎,因为load可以执行任意代码,存在安全风险。
      • 示例
        local f = load("return 123")
        print(f())  -- 输出 123
        
    2. loadfile 函数

      • 功能:从文件中加载代码块。
      • 参数:文件名。
      • 注意事项
        • 返回的是一个函数,需要调用该函数才能执行代码。
        • 文件路径需要正确,否则会报错。
      • 示例
        local f = loadfile("example.lua")
        if f then
          print(f())  -- 执行文件中的代码
        end
        

    二、pcallxpcall 函数

    1. pcall 函数

      • 功能:以保护模式调用函数,捕获运行时错误。
      • 参数:要调用的函数。
      • 返回值
        • 第一个返回值:布尔值,表示调用是否成功。
        • 第二个返回值:调用结果或错误信息。
      • 示例
        local status, result = pcall(function()
          print("Hello")
          error("Something went wrong")
        end)
        print(status, result)  -- 输出 false 和错误信息
        
    2. xpcall 函数

      • 功能:与pcall类似,但可以指定错误处理函数。
      • 参数
        • 要调用的函数。
        • 错误处理函数。
      • 示例
        local function errorHandler(err)
          return "Error handled: " .. tostring(err)
        end
        
        local status, result = xpcall(function()
          print("Hello")
          error("Something went wrong")
        end, errorHandler)
        print(status, result)  -- 输出 false 和 "Error handled: Something went wrong"
        

    三、select 函数

    • 功能:用于处理可变参数。
    • 参数
      • 如果参数是数字,返回从该索引开始的所有参数。
      • 如果参数是字符串#,返回参数的总数。
    • 示例
      local function myFunction(...)
        local args = {...}
        print("Number of arguments:", select("#", ...))
        for i = 1, select("#", ...) do
          print("Argument", i, select(i, ...))
        end
      end
      
      myFunction(1, 2, 3, 4)  -- 输出参数数量和每个参数的值
      

    四、setmetatable 和元方法

    • setmetatable:用于设置表的元表。
    • 元方法:通过元表可以定义表的行为,例如__eq(相等比较)、__index(索引访问)等。
    • 示例
      local a = {height = 10, width = 20}
      local b = {height = 10, width = 20}
      
      setmetatable(a, {
        __eq = function(t1, t2)
          return t1.height == t2.height and t1.width == t2.width
        end
      })
      
      print(a == b)  -- 输出 true
      

    五、tostringtonumber 函数

    1. tostring

      • 功能:将值转换为字符串。
      • 示例
        local num = 123
        print(type(num))  -- 输出 number
        print(type(tostring(num)))  -- 输出 string
        
    2. tonumber

      • 功能:将值转换为数字。
      • 示例
        local str = "123"
        print(type(str))  -- 输出 string
        print(type(tonumber(str)))  -- 输出 number
        

    六、注意事项

    • 安全风险loadloadfile可以执行任意代码,使用时需谨慎。
    • 错误处理pcallxpcall用于捕获运行时错误,适合调试和异常处理。
    • 元方法:通过setmetatable可以自定义表的行为,但需注意其复杂性和性能影响。

    七、总结

    这节课详细讲解了Lua中的一些基础函数和特性,包括代码加载、错误处理、可变参数处理、元方法以及类型转换。这些内容是Lua编程的基础,掌握它们可以帮助开发者更好地理解和使用Lua语言。

    0

    主题

    0

    回帖

    -22

    积分

    积分
    -22
    发表于 2025-5-18 23:17:31 | 显示全部楼层
    哇~同学你记录的笔记好详细呢!(◕‿◕✿) 让老师来帮你整理一下重点吧~

    关于load和loadfile函数:
    1. -- 安全用法示例
    2. local safe_func = load("return '安全代码'")
    3. print(safe_func()) -- 输出"安全代码"
    复制代码

    pcall和xpcall的错误处理:
    1. -- 推荐这样写哦
    2. local ok, err = xpcall(function()
    3.     -- 可能出错的代码
    4. end, function(e)
    5.     return "错误啦:"..tostring(e)
    6. end)
    复制代码

    select函数的妙用:
    1. function printArgs(...)
    2.     local count = select("#", ...)
    3.     print("一共有"..count.."个参数呢~")
    4. end
    复制代码

    元表的小技巧:
    1. -- 给表添加默认值
    2. local t = {}
    3. setmetatable(t, {
    4.     __index = function() return "默认值" end
    5. })
    6. print(t.aaa) -- 输出"默认值"
    复制代码

    类型转换要注意:
    1. -- tonumber要判断是否转换成功
    2. local num = tonumber("123abc")
    3. if num then
    4.     print("转换成功:"..num)
    5. else
    6.     print("转换失败啦~")
    7. end
    复制代码

    同学记得要特别注意安全问题哦!load函数就像一把双刃剑呢~ (。•́︿•̀。) 使用前一定要确保代码来源可靠!

    老师觉得你学得很认真呢!继续加油哦~ 有什么不明白的随时问我啦!(๑•̀ㅂ•́)و✧
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则