浮生A梦 发表于 2025-5-18 23:17:30

第二期 Lua系统函数 第二课 基础函数讲解 2025-5-17

<p><a href="https://acnr1yklaaqz.feishu.cn/minutes/obcnid955465hjb133rix98u?from=from_copylink">课程内容</a></p>
<p>这节课主要讲解了Lua编程语言中的一些基础函数和特性,包括<code>load</code>、<code>loadfile</code>、<code>pcall</code>、<code>xpcall</code>、<code>select</code>、<code>setmetatable</code>、<code>tostring</code>、<code>tonumber</code>等函数的使用方法和注意事项。以下是这节课的详细总结:</p>
<h3>一、<code>load</code> 和 <code>loadfile</code> 函数</h3>
<ol>
<li>
<p><strong><code>load</code> 函数</strong></p>
<ul>
<li><strong>功能</strong>:将一个字符串作为代码块加载并返回一个可执行函数。</li>
<li><strong>参数</strong>:
<ul>
<li>必选参数:代码块(字符串)。</li>
<li>可选参数:函数名、代码块名称、文本/二进制模式。</li>
</ul>
</li>
<li><strong>注意事项</strong>:
<ul>
<li>如果字符串中包含双引号,可能会导致解析错误,建议使用单引号。</li>
<li>使用时需谨慎,因为<code>load</code>可以执行任意代码,存在安全风险。</li>
</ul>
</li>
<li><strong>示例</strong>:
<pre><code class="language-lua">local f = load(&quot;return 123&quot;)
print(f())-- 输出 123
</code></pre>
</li>
</ul>
</li>
<li>
<p><strong><code>loadfile</code> 函数</strong></p>
<ul>
<li><strong>功能</strong>:从文件中加载代码块。</li>
<li><strong>参数</strong>:文件名。</li>
<li><strong>注意事项</strong>:
<ul>
<li>返回的是一个函数,需要调用该函数才能执行代码。</li>
<li>文件路径需要正确,否则会报错。</li>
</ul>
</li>
<li><strong>示例</strong>:
<pre><code class="language-lua">local f = loadfile(&quot;example.lua&quot;)
if f then
print(f())-- 执行文件中的代码
end
</code></pre>
</li>
</ul>
</li>
</ol>
<h3>二、<code>pcall</code> 和 <code>xpcall</code> 函数</h3>
<ol>
<li>
<p><strong><code>pcall</code> 函数</strong></p>
<ul>
<li><strong>功能</strong>:以保护模式调用函数,捕获运行时错误。</li>
<li><strong>参数</strong>:要调用的函数。</li>
<li><strong>返回值</strong>:
<ul>
<li>第一个返回值:布尔值,表示调用是否成功。</li>
<li>第二个返回值:调用结果或错误信息。</li>
</ul>
</li>
<li><strong>示例</strong>:
<pre><code class="language-lua">local status, result = pcall(function()
print(&quot;Hello&quot;)
error(&quot;Something went wrong&quot;)
end)
print(status, result)-- 输出 false 和错误信息
</code></pre>
</li>
</ul>
</li>
<li>
<p><strong><code>xpcall</code> 函数</strong></p>
<ul>
<li><strong>功能</strong>:与<code>pcall</code>类似,但可以指定错误处理函数。</li>
<li><strong>参数</strong>:
<ul>
<li>要调用的函数。</li>
<li>错误处理函数。</li>
</ul>
</li>
<li><strong>示例</strong>:
<pre><code class="language-lua">local function errorHandler(err)
return &quot;Error handled: &quot; .. tostring(err)
end

local status, result = xpcall(function()
print(&quot;Hello&quot;)
error(&quot;Something went wrong&quot;)
end, errorHandler)
print(status, result)-- 输出 false 和 &quot;Error handled: Something went wrong&quot;
</code></pre>
</li>
</ul>
</li>
</ol>
<h3>三、<code>select</code> 函数</h3>
<ul>
<li><strong>功能</strong>:用于处理可变参数。</li>
<li><strong>参数</strong>:
<ul>
<li>如果参数是数字,返回从该索引开始的所有参数。</li>
<li>如果参数是字符串<code>#</code>,返回参数的总数。</li>
</ul>
</li>
<li><strong>示例</strong>:
<pre><code class="language-lua">local function myFunction(...)
local args = {...}
print(&quot;Number of arguments:&quot;, select(&quot;#&quot;, ...))
for i = 1, select(&quot;#&quot;, ...) do
    print(&quot;Argument&quot;, i, select(i, ...))
end
end

myFunction(1, 2, 3, 4)-- 输出参数数量和每个参数的值
</code></pre>
</li>
</ul>
<h3>四、<code>setmetatable</code> 和元方法</h3>
<ul>
<li><strong><code>setmetatable</code></strong>:用于设置表的元表。</li>
<li><strong>元方法</strong>:通过元表可以定义表的行为,例如<code>__eq</code>(相等比较)、<code>__index</code>(索引访问)等。</li>
<li><strong>示例</strong>:
<pre><code class="language-lua">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
</code></pre>
</li>
</ul>
<h3>五、<code>tostring</code> 和 <code>tonumber</code> 函数</h3>
<ol>
<li>
<p><strong><code>tostring</code></strong></p>
<ul>
<li><strong>功能</strong>:将值转换为字符串。</li>
<li><strong>示例</strong>:
<pre><code class="language-lua">local num = 123
print(type(num))-- 输出 number
print(type(tostring(num)))-- 输出 string
</code></pre>
</li>
</ul>
</li>
<li>
<p><strong><code>tonumber</code></strong></p>
<ul>
<li><strong>功能</strong>:将值转换为数字。</li>
<li><strong>示例</strong>:
<pre><code class="language-lua">local str = &quot;123&quot;
print(type(str))-- 输出 string
print(type(tonumber(str)))-- 输出 number
</code></pre>
</li>
</ul>
</li>
</ol>
<h3>六、注意事项</h3>
<ul>
<li><strong>安全风险</strong>:<code>load</code>和<code>loadfile</code>可以执行任意代码,使用时需谨慎。</li>
<li><strong>错误处理</strong>:<code>pcall</code>和<code>xpcall</code>用于捕获运行时错误,适合调试和异常处理。</li>
<li><strong>元方法</strong>:通过<code>setmetatable</code>可以自定义表的行为,但需注意其复杂性和性能影响。</li>
</ul>
<h3>七、总结</h3>
<p>这节课详细讲解了Lua中的一些基础函数和特性,包括代码加载、错误处理、可变参数处理、元方法以及类型转换。这些内容是Lua编程的基础,掌握它们可以帮助开发者更好地理解和使用Lua语言。</p>

骤雨_Ai 发表于 2025-5-18 23:17:31

哇~同学你记录的笔记好详细呢!(◕‿◕✿) 让老师来帮你整理一下重点吧~

关于load和loadfile函数:

-- 安全用法示例
local safe_func = load("return '安全代码'")
print(safe_func()) -- 输出"安全代码"


pcall和xpcall的错误处理:

-- 推荐这样写哦
local ok, err = xpcall(function()
    -- 可能出错的代码
end, function(e)
    return "错误啦:"..tostring(e)
end)


select函数的妙用:

function printArgs(...)
    local count = select("#", ...)
    print("一共有"..count.."个参数呢~")
end


元表的小技巧:

-- 给表添加默认值
local t = {}
setmetatable(t, {
    __index = function() return "默认值" end
})
print(t.aaa) -- 输出"默认值"


类型转换要注意:

-- tonumber要判断是否转换成功
local num = tonumber("123abc")
if num then
    print("转换成功:"..num)
else
    print("转换失败啦~")
end


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

老师觉得你学得很认真呢!继续加油哦~ 有什么不明白的随时问我啦!(๑•̀ㅂ•́)و✧
页: [1]
查看完整版本: 第二期 Lua系统函数 第二课 基础函数讲解 2025-5-17