您的位置:首页 > 文旅 > 美景 > 厦门公共资源交易中心_网站管理工作_百度推广账户搭建_网站排名优化技巧

厦门公共资源交易中心_网站管理工作_百度推广账户搭建_网站排名优化技巧

2025/4/17 4:37:16 来源:https://blog.csdn.net/avi9111/article/details/147033352  浏览:    关键词:厦门公共资源交易中心_网站管理工作_百度推广账户搭建_网站排名优化技巧
厦门公共资源交易中心_网站管理工作_百度推广账户搭建_网站排名优化技巧

很坦白说,这十年,我几乎没办法从互联网找到这个这样的代码,互联网引擎找不到,我也没有很大的“追求”要传承,或者要宣传什么;直到DeepSeek的出现

兄弟,Deepseek现在已经比你更了解你楼下的超市现在有什么货品

十年之后这一切就不在稀奇,因为十年之前你可能不会想知道智能手机是什么东西
在这里插入图片描述

在这里插入图片描述
在 Lua 中,虽然没有内置的类(Class)系统,但可以通过 元表(metatable)元方法(metamethods) 模拟面向对象的类。以下是一个完整的类实现示例:


第一步:定义基础类构造器

-- 定义一个全局的 Class 函数,用于创建类
function Class(...)local cls = {}local parents = {...} -- 支持多继承(此处以单继承为例)-- 设置类的元表cls.__index = cls-- 如果存在父类,设置继承if #parents > 0 thensetmetatable(cls, {__index = function(_, key)-- 遍历所有父类,查找方法或属性for _, parent in ipairs(parents) dolocal value = parent[key]if value then return value endendend})end-- 类的构造函数(可选)function cls.new(...)local instance = setmetatable({}, cls)if cls.__init__ thencls.__init__(instance, ...)endreturn instanceendreturn cls
end

第二步:定义一个基类(例如 Animal

-- 创建 Animal 类
local Animal = Class()-- 构造函数
function Animal:__init__(name)self.name = name
end-- 方法
function Animal:speak()print(self.name .. " makes a sound.")
end

第三步:定义子类(例如 Cat 继承 Animal

-- 创建 Cat 类,继承自 Animal
local Cat = Class(Animal)-- 重写构造函数
function Cat:__init__(name, color)-- 调用父类构造函数(显式传递 self)Animal.__init__(self, name)self.color = color
end-- 重写方法
function Cat:speak()print(self.name .. " says Meow!")
end-- 新增方法
function Cat:describe()print(self.name .. " is a " .. self.color .. " cat.")
end

第四步:使用类

-- 创建实例
local myCat = Cat.new("Whiskers", "black")-- 调用方法
myCat:speak()    -- 输出: Whiskers says Meow!
myCat:describe() -- 输出: Whiskers is a black cat.-- 访问属性
print(myCat.name)  -- 输出: Whiskers
print(myCat.color) -- 输出: black

关键概念解释

  1. 元表(metatable)

    • 通过 setmetatable(instance, cls) 让实例继承类的方法。
    • __index 元方法用于在实例中找不到属性/方法时,从类或父类中查找。
  2. 构造函数

    • 约定使用 __init__ 方法初始化实例。
    • 通过 cls.new(...) 创建实例时自动调用。
  3. 继承

    • 子类通过 Class(Parent) 继承父类。
    • 方法重写直接定义同名方法,调用父类方法需显式指定(如 Parent.method(self, ...))。

扩展:支持多继承

若需要多继承,修改 Class 函数中的 __index 逻辑,遍历所有父类查找方法:

function Class(...)local cls = {}local parents = {...}cls.__index = clsif #parents > 0 thensetmetatable(cls, {__index = function(_, key)for _, parent in ipairs(parents) dolocal value = parent[key]if value then return value endendend})end-- ...其余代码不变
end

通过这种方式,你可以在 Lua 中实现类似其他语言的面向对象编程模式。

在这里插入图片描述
在 Lua 中,条件分支的写法与其他语言略有不同。Lua 使用 elseif(注意是连写,中间没有空格)来实现多条件判断,而不是 else if。以下是详细语法和示例:


基本语法

if 条件1 then-- 条件1成立时执行的代码
elseif 条件2 then  -- 注意是 elseif(连写)-- 条件2成立时执行的代码
elseif 条件3 then-- 条件3成立时执行的代码
else-- 所有条件都不成立时执行的代码
end

示例代码

local score = 85if score >= 90 thenprint("优秀")
elseif score >= 80 then  -- 注意此处是 elseifprint("良好")
elseif score >= 60 thenprint("及格")
elseprint("不及格")
end-- 输出: 良好

常见错误

错误1:写成 else if(中间有空格)
if score >= 90 thenprint("优秀")
else if score >= 80 then  -- ❌ 错误写法(应为 elseif)print("良好")
end
-- 会导致语法错误:缺少 end
错误2:遗漏 then
elseif score >= 80  -- ❌ 缺少 thenprint("良好")

对比其他语言

语言写法示例
Luaelseifelseif x > 0 then
C/Javaelse ifelse if (x > 0) { ... }
Pythonelifelif x > 0:

嵌套条件(复杂场景)

local age = 25
local is_vip = trueif age < 18 thenprint("未成年人禁止访问")
elseif is_vip thenprint("VIP用户欢迎进入")
elseprint("普通用户请付费")
end

关键点总结

  1. Lua 中使用 elseif连写,无空格)实现多条件分支。
  2. 每个条件后必须跟 then
  3. 整个结构以 end 结束。
  4. 不支持类似 C/Java 的 else if 多单词写法。

三 lua require

在 Lua 中,没有直接的 import 关键字(类似 Python 或 JavaScript),但可以通过 模块机制require 函数来实现类似的功能。以下是 Lua 中导入和使用模块的完整方法:


1. 基础模块导入:require

Lua 使用 require 函数加载其他文件或模块,语法如下:

-- 导入模块,并赋值给变量(推荐)
local 模块名 = require("模块路径")
示例:
-- 导入名为 "utils.lua" 的模块
local utils = require("utils")-- 使用模块中的函数
utils.printMessage("Hello, Lua!")

2. 模块的编写规范

模块通常是一个 .lua 文件,返回一个包含函数或数据的 table

示例(utils.lua):
local utils = {} -- 创建一个局部 tablefunction utils.add(a, b)return a + b
endfunction utils.printMessage(msg)print("Message:", msg)
endreturn utils -- 必须返回这个 table

3. 模块路径规则

Lua 的 require 会按以下路径查找模块(以分号 ; 分隔):

-- 默认搜索路径(可通过 package.path 查看)
?.lua;?/init.lua;/usr/local/share/lua/5.4/?.lua
  • ? 会被替换为模块名(例如 require("lib.utils") 会查找 lib/utils.lua)。
  • 可以通过修改 package.pathpackage.cpath 自定义搜索路径。

4. 常见导入模式

(1) 导入为局部变量(推荐)
local math_utils = require("math_utils")
print(math_utils.sum(1, 2))
(2) 直接解构函数(类似 Python 的 from module import func
local sum = require("math_utils").sum
print(sum(1, 2))
(3) 全局导入(不推荐,可能污染命名空间)
-- 模块返回的内容会被赋值给全局变量
require("math_utils")
print(math_utils.sum(1, 2))

5. 避免重复加载

Lua 的 require 会缓存已加载的模块(存储在 package.loaded 中),重复调用 require 不会重新加载文件:

-- 第一次加载
local mod = require("mymodule")-- 后续调用直接返回缓存
local mod_again = require("mymodule") -- 不会重新执行文件

若要强制重新加载,可清除缓存:

package.loaded["mymodule"] = nil
local mod = require("mymodule") -- 重新加载

6. 错误处理

如果模块不存在,require 会抛出错误。可使用 pcall 捕获异常:

local ok, mymod = pcall(require, "non_existent_module")
if not ok thenprint("模块加载失败:", mymod)
end

7. 高级用法:模拟 import 语法

可以通过元表或自定义函数模拟其他语言的 import 风格:

示例(类似 Python 的 from module import *):
function import(module)local mod = require(module)for k, v in pairs(mod) do_G[k] = v -- 将模块内容注入全局环境(慎用)end
endimport("math_utils")
print(sum(1, 2)) -- 直接调用

关键点总结

操作方法
导入模块local mod = require("mod_path")
模块编写返回一个包含函数/数据的 table
路径配置修改 package.pathpackage.cpath
重载模块package.loaded["mod"] = nil 后再次 require
错误处理使用 pcall(require, "mod") 捕获异常

常见问题

1. 模块路径找不到?
  • 检查 package.path 是否包含模块所在目录。
  • 使用相对路径时需注意工作目录(可通过 lua -l 指定路径)。
2. 模块返回 nil
  • 确保模块文件最后有 return 语句。
3. 循环依赖?
  • 避免模块 A 依赖 B,同时 B 依赖 A。重构代码或延迟加载。

标题四

在这里插入图片描述
在 Lua 中,require 默认会缓存已加载的模块(存储在 package.loaded 表中),因此当文件被修改后,直接再次调用 require 不会重新加载最新的代码。要实现「修改文件后立即刷新」,可以通过以下方法:


方法 1:手动清除缓存

在调用 require 前,手动清除 package.loaded 中的模块缓存:

-- 清除模块缓存
package.loaded["模块名"] = nil
-- 重新加载模块
local mod = require("模块名")

示例
假设有一个模块文件 my_module.lua,修改后需要重新加载:

-- 清除缓存并重新加载
package.loaded["my_module"] = nil
local my_module = require("my_module")

方法 2:封装自动刷新函数

创建一个自定义的 require 函数,自动处理缓存清除:

function requireFresh(moduleName)package.loaded[moduleName] = nil  -- 清除缓存return require(moduleName)       -- 重新加载
end-- 使用示例
local my_module = requireFresh("my_module")

方法 3:结合 dofile 直接执行文件

使用 dofile 直接执行文件(不依赖 require 的缓存机制):

-- 直接加载文件(假设文件路径为 "my_module.lua")
local my_module = dofile("my_module.lua")

注意:dofile 不会处理模块路径搜索,需指定完整路径。


方法 4:监听文件修改时间(高级)

通过检查文件修改时间,自动触发重新加载(需 LuaFileSystem 库支持):

local lfs = require("lfs")-- 记录文件初始修改时间
local file_time = lfs.attributes("my_module.lua", "modification")function reloadIfModified()local new_time = lfs.attributes("my_module.lua", "modification")if new_time > file_time thenpackage.loaded["my_module"] = nilrequire("my_module")file_time = new_timeprint("模块已重新加载")end
end-- 定期调用此函数检查文件是否修改

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com