Deprecated: parse_url(): Passing null to parameter #1 ($url) of type string is deprecated in /www/wwwroot/blog_qqvbc_com/usr/plugins/Access/Access_Core.php on line 339

Deprecated: parse_url(): Passing null to parameter #1 ($url) of type string is deprecated in /www/wwwroot/blog_qqvbc_com/usr/plugins/Access/Access_Core.php on line 392

Deprecated: parse_url(): Passing null to parameter #1 ($url) of type string is deprecated in /www/wwwroot/blog_qqvbc_com/usr/plugins/Access/Access_Core.php on line 394
分类 默认分类 下的文章 - Joyber 的博客

分类 默认分类 下的文章

Lua 进阶极简教程(高阶核心+纯用法)

lua基础版

说明:承接Lua基础教程,全文无冗余描述,仅保留进阶核心知识点 + 作用 + 可运行代码,覆盖Lua高阶开发全部刚需内容。

一、变量深层特性(进阶必懂)

1. 全局环境 \_G

作用:存储所有全局变量、函数的全局表,可动态遍历、修改全局内容

-- 查看所有全局变量
print(_G)

-- 定义全局变量等价写法
_G.testVal = 100
print(testVal)

-- 遍历所有全局函数/变量
for k,v in pairs(_G) do
    print(k,v)
end

2. 局部变量优化

作用:局部变量访问速度远快于全局变量,高阶开发优先局部缓存

-- 缓存全局函数,提升执行效率
local print = print
local pairs = pairs

print("优化后的局部调用")

3. 变量nil清空与垃圾回收

作用:主动置空变量,触发GC释放内存,避免内存泄漏

local data = {1,2,3,4}
data = nil -- 置空引用,等待GC回收
collectgarbage() -- 手动触发垃圾回收

二、函数进阶(Lua核心高阶)

1. 闭包(Closure)

作用:内层函数捕获外层局部变量,变量常驻内存,实现数据私有、状态保存

local function counter()
    local num = 0 -- 被捕获的局部变量
    return function()
        num = num + 1
        return num
    end
end

-- 独立状态,互不干扰
local c1 = counter()
local c2 = counter()
print(c1()) -- 1
print(c1()) -- 2
print(c2()) -- 1

2. 函数尾调用(Tail Call)

作用:尾部调用函数,不堆叠栈帧,避免递归栈溢出,优化递归性能

-- 尾递归写法(无栈溢出)
local function factorial(n, res)
    res = res or 1
    if n <= 1 then return res end
    return factorial(n-1, n*res) -- 纯粹尾部返回
end

print(factorial(10))

3. 函数重载模拟

作用:Lua无原生重载,通过判断参数数量/类型实现多参数适配

local function add(...)
    local args = {...}
    if #args == 1 then
        return args[1] * 2
    elseif #args == 2 then
        return args[1] + args[2]
    end
end

print(add(10))  -- 20
print(add(10,20)) -- 30

4. 函数缓存(记忆化)

作用:缓存函数执行结果,避免重复计算,大幅提升高频函数效率

local cache = {}
local function fib(n)
    if cache[n] then return cache[n] end
    if n <= 2 then return 1 end
    local res = fib(n-1) + fib(n-2)
    cache[n] = res
    return res
end

print(fib(30))

三、Table 高阶操作(Lua灵魂)

1. 数组与哈希表分离原理

作用:Lua table 内部分数组段(连续数字key)、哈希段(自定义key),优化存储

-- 纯数组(高效)
local arr = {1,2,3,4}
-- 纯哈希(高效)
local hash = {a=1,b=2}
-- 混合表(性能略低,不推荐高频使用)
local mix = {1,2,a=3,b=4}

2. 表深拷贝/浅拷贝

作用:解决table默认引用赋值问题,独立复制数据表

-- 浅拷贝(仅复制一层)
local function shallowCopy(t)
    local res = {}
    for k,v in pairs(t) do res[k] = v end
    return res
end

-- 深拷贝(递归复制所有层级)
local function deepCopy(t)
    local res = {}
    if type(t) ~= "table" then return t end
    for k,v in pairs(t) do
        res[k] = deepCopy(v)
    end
    return res
end

local t1 = {1,2,{3,4}}
local t2 = deepCopy(t1)
t2[3][1] = 99
print(t1[3][1]) -- 原表不变

3. 表去重/排序/过滤

作用:高频数组处理工具方法

-- 数组去重
local function unique(arr)
    local temp = {}
    local res = {}
    for _,v in ipairs(arr) do
        if not temp[v] then
            temp[v] = true
            table.insert(res, v)
        end
    end
    return res
end

-- 自定义排序
local arr = {3,1,4,2}
table.sort(arr, function(a,b)
    return a > b -- 降序,默认升序
end)
print(table.concat(arr, ","))

四、元表与元方法(Lua进阶核心)

1. 基础元表读写

作用:为table绑定元表,拦截、自定义table操作行为

local t = {}
local mt = {}

setmetatable(t, mt) -- 绑定元表
local getMt = getmetatable(t) -- 获取元表
print(getMt == mt)

2. 常用元方法全覆盖

作用:拦截加减乘除、取值、赋值、长度、打印等操作

local t = {10,20}
local mt = {
    -- 取值拦截:t[key]
    __index = function(tab, k)
        return "默认值"
    end,
    -- 赋值拦截:t[key] = v
    __newindex = function(tab, k, v)
        print("禁止赋值")
    end,
    -- 加法重载 t1 + t2
    __add = function(a,b)
        return {a[1]+b[1], a[2]+b[2]}
    end,
    -- 打印重载 print(t)
    __tostring = function(tab)
        return "自定义表字符串"
    end,
    -- 长度重载 #t
    __len = function()
        return 99
    end
}

setmetatable(t, mt)
print(t[3])
t[1] = 999
print(t)
print(#t)

3. \_\_index 索引优化(继承核心)

作用:实现表的默认值、数据继承、查找降级

-- 默认值配置
local default = {name="默认", age=18}
local t = {}
setmetatable(t, {__index = default})

print(t.name) -- 找不到key,去元表查找

五、面向对象高阶(纯Lua实现)

1. 标准类、继承、重写

作用:完整OOP体系,支持封装、单继承、方法重写

-- 父类
local Person = {}
Person.__index = Person

function Person:new(name, age)
    local self = setmetatable({}, Person)
    self.name = name
    self.age = age
    return self
end

function Person:show()
    print(self.name, self.age)
end

-- 子类继承
local Student = {}
Student.__index = Student
setmetatable(Student, Person) -- 继承父类

function Student:new(name, age, id)
    local self = Person:new(name, age)
    self.id = id
    return setmetatable(self, Student)
end

-- 方法重写
function Student:show()
    print("学生:", self.name, self.id)
end

local s = Student:new("张三", 16, "001")
s:show()

2. 私有变量模拟

作用:通过闭包实现类私有属性,外部无法修改

local function User(name)
    -- 私有变量
    local _name = name

    -- 公开方法
    return {
        getName = function()
            return _name
        end,
        setName = function(n)
            _name = n
        end
    }
end

local u = User("李四")
print(u.getName())
-- print(u._name) 无法访问私有变量

六、协程高阶(Lua特色)

1. 协程完整生命周期

作用:掌握协程创建、启动、暂停、恢复、状态判断

local co = coroutine.create(function()
    print("协程第一步")
    coroutine.yield("暂停返回值")
    print("协程第二步")
    return "结束返回值"
end)

print(coroutine.status(co)) -- suspended 挂起
local ok, res1 = coroutine.resume(co)
print(res1)
local ok2, res2 = coroutine.resume(co)
print(res2)
print(coroutine.status(co)) -- dead 结束

2. 协程传参技巧

作用:resume与yield双向传参,实现数据交互

local co = coroutine.create(function(a)
    print("初始参数:", a)
    local b = coroutine.yield("第一次返回")
    print("恢复参数:", b)
end)

coroutine.resume(co, 100)
coroutine.resume(co, 200)

七、模块化与代码解耦

1. 标准模块封装写法

作用:规范模块导出,隔离全局环境,工程化开发必备

-- 新建 tool.lua 模块文件
local Tool = {}
Tool.__index = Tool

-- 私有函数(外部无法访问)
local function log(str)
    print("[日志]", str)
end

-- 公开函数
function Tool:add(a,b)
    log("执行加法")
    return a + b
end

return Tool

-- 主文件调用
-- local Tool = require("tool")
-- print(Tool:add(1,2))

2. 模块卸载与重载

作用:解决require缓存问题,支持热更新

-- 卸载模块
package.loaded["tool"] = nil
-- 重新加载
local Tool = require("tool")

八、错误处理与调试高阶

1. assert 断言

作用:条件不成立直接报错,用于参数校验

local num = nil
assert(num, "变量不能为空!")

2. xpcall 带栈追踪捕获错误

作用:比pcall多堆栈信息,精准定位报错位置

local function errHandler(err)
    return err .. "\n" .. debug.traceback()
end

local ok, res = xpcall(function()
    print(1/0)
end, errHandler)

if not ok then
    print("错误详情:", res)
end

3. debug 调试库

作用:查看函数栈、局部变量,高阶调试排错

local function test()
    local a = 100
    print(debug.localvars(1)) -- 打印当前函数局部变量
end
test()

九、字符串与正则进阶

作用:Lua原生正则(模式匹配),无需第三方库

local s = "Lua123Python456"

-- 匹配数字
print(string.match(s, "%d+"))
-- 匹配字母
print(string.match(s, "%a+"))
-- 全局替换
print(string.gsub(s, "%d", ""))
-- 查找所有匹配
for v in string.gmatch(s, "%d+") do
    print(v)
end

十、GC内存优化(工程必备)

作用:控制垃圾回收,优化游戏/长驻程序内存

collectgarbage("stop")  -- 停止GC
collectgarbage("restart")-- 重启GC
collectgarbage("count") -- 获取当前内存占用(KB)
collectgarbage()        -- 手动全量回收

print("当前内存:", collectgarbage("count"))

Python 极简完整教程(全知识点+纯用法)

说明:全文无冗余描述,每项只写:作用 + 标准代码写法,可直接复制运行。覆盖Python入门到进阶全部核心知识点。

一、基础语法规则

1. 注释

作用:代码备注,不执行

# 单行注释

"""
多行注释
多行注释
"""

'''
多行注释
多行注释
'''

2. 语句规则

作用:代码书写规范

  • Python 禁止随意缩进,缩进代表代码块(4个空格/1个Tab)
  • 大小写敏感:a 和 A 是两个变量
  • 语句结尾无需分号(可加但不推荐)
  • 标识符:字母/下划线开头,后跟字母、数字、下划线,不能用关键字

3. 打印输出

作用:控制台打印内容

print("Hello Python")
print(123, True, None)
# 换行/不换行
print("默认换行")
print("不换行", end="")

二、六大核心数据类型

作用:存储各类数据,type()查看数据类型

# 1. None 空值
a = None

# 2. bool 布尔
b = True
c = False

# 3. 数字类型(int整数 / float小数 / complex复数)
d = 100    # int
e = 3.14   # float
f = 1+2j   # complex

# 4. str 字符串
str1 = "双引号"
str2 = '单引号'
str3 = """
多行
字符串
"""

# 5. 序列/容器类型
list1 = [1,2,3]      # 列表
tuple1 = (1,2,3)     # 元组
dict1 = {"name":"py"}# 字典
set1 = {1,2,3}       # 集合

# 查看类型
print(type(a))
print(type(str1))

三、变量与赋值

作用:存储数据,Python变量无声明关键字,动态类型

# 单个赋值
num = 100

# 多变量赋值
a, b, c = 1, 2, 3

# 批量同值赋值
x = y = z = 666

# 变量交换(无需中间变量)
m, n = 10, 20
m, n = n, m

# 动态类型:可随意变更变量类型
var = 123
var = "字符串"

四、运算符

1. 算术运算符

a = 10
b = 3
print(a + b)   # 加
print(a - b)   # 减
print(a * b)   # 乘
print(a / b)   # 浮点除
print(a // b)  # 整除(向下取整)
print(a % b)   # 取余
print(a ** b)  # 幂运算
print(-a)      # 负号

2. 关系运算符

返回 True/False

print(10 == 10)  # 等于
print(10 != 3)   # 不等于
print(10 > 3)    # 大于
print(10 < 3)    # 小于
print(10 >= 3)   # 大于等于
print(10 <= 3)   # 小于等于

3. 逻辑运算符

print(True and False)  # 与
print(True or False)   # 或
print(not True)        # 非

# 短路赋值技巧
n = None
res = n or 100  # 空值则取默认值100

4. 成员/身份运算符

# 成员运算符 in / not in
lst = [1,2,3]
print(1 in lst)
print(4 not in lst)

# 身份运算符 is / is not(判断内存地址)
a = [1,2]
b = [1,2]
print(a is b)
print(a == b)

五、流程控制

1. if 条件判断

# 单分支
a = 10
if a > 5:
    print("大于5")

# 双分支
if a > 20:
    print("大")
else:
    print("小")

# 多分支
if a < 5:
    print("小")
elif a < 15:
    print("中")
else:
    print("大")

# 三元表达式(极简判断)
res = "是" if a > 5 else "否"

2. for 循环

# 基础数值循环
for i in range(1, 6):  # 1-5,左闭右开
    print(i)

# 带步长循环
for i in range(1, 10, 2):
    print(i)

# 遍历字符串/列表
for char in "python":
    print(char)

for item in [11,22,33]:
    print(item)

3. while 循环

i = 1
while i <= 3:
    print(i)
    i += 1

# 无限循环
# while True:
#     print("循环")

4. 循环跳转

# break 跳出整个循环
for i in range(1,10):
    if i == 3:
        break
    print(i)

# continue 跳出本次循环,继续下一次
for i in range(1,10):
    if i == 3:
        continue
    print(i)

六、函数(核心)

作用:封装代码、复用逻辑、简化代码

1. 基础函数

# 定义
def add(a, b):
    return a + b

# 调用
print(add(2, 3))

2. 参数类型

# 默认参数
def func1(a, b=10):
    return a + b

# 关键字参数
func1(a=5, b=20)

# 可变位置参数 *args(接收元组)
def func2(*args):
    print(args)

func2(1,2,3)

# 可变关键字参数 **kwargs(接收字典)
def func3(**kwargs):
    print(kwargs)

func3(name="py", age=20)

3. 多返回值

def get_pos():
    return 10, 20

x, y = get_pos()
print(x, y)

4. 匿名函数 lambda

# 单行极简函数
f = lambda a,b: a * b
print(f(2,5))

七、四大容器精讲

1. 列表 list(有序、可变、可重复)

# 定义
lst = [1,2,3,"py"]

# 增删改查
lst.append(4)        # 尾部添加
lst.insert(1, 99)    # 指定位置插入
lst.pop()            # 删除末尾
lst.remove(99)       # 指定元素删除
lst[0] = 100         # 修改元素
print(lst[0])        # 索引取值

# 切片
print(lst[1:3])      # 1-2位
print(lst[::-1])     # 反转列表

# 常用方法
print(len(lst))      # 长度
lst.sort()           # 排序
lst.reverse()        # 反转

2. 元组 tuple(有序、不可变、可重复)

# 定义
tup = (1,2,3)
tup2 = (1,)  # 单个元素必须加逗号

# 查(无修改删除方法)
print(tup[0])
print(len(tup))

3. 字典 dict(无序、可变、键唯一)

# 定义
d = {"name":"python", "age":20}

# 增改查
print(d["name"])             # 取值
print(d.get("sex", "未知"))  # 安全取值
d["version"] = 3.10          # 新增键值对
d["age"] = 21                # 修改值

# 删除
del d["version"]

# 遍历
print(d.keys())   # 所有键
print(d.values()) # 所有值
print(d.items())  # 所有键值对

4. 集合 set(无序、可变、元素唯一)

# 定义(自动去重)
s = {1,2,2,3}

# 增删
s.add(4)
s.remove(3)

# 集合运算
a = {1,2,3}
b = {3,4,5}
print(a & b)  # 交集
print(a | b)  # 并集
print(a - b)  # 差集

八、字符串常用操作

s = "PythonStudy"

print(len(s))          # 字符串长度
print(s.upper())       # 转大写
print(s.lower())       # 转小写
print(s.strip())       # 去除首尾空格
print(s.find("Py"))    # 查找下标
print(s.replace("Py","Go")) # 替换
print(s.split("t"))    # 分割成列表
print(s[0:3])          # 切片截取

# 字符串格式化
name = "python"
print(f"语言:{name}")  # f-string(推荐)
print("语言:%s" % name)

九、迭代遍历

# 遍历列表(带下标)
lst = [11,22,33]
for idx, val in enumerate(lst):
    print(idx, val)

# 遍历字典
d = {"a":1, "b":2}
for k, v in d.items():
    print(k, v)

十、变量作用域

# 全局变量
num = 10

def test():
    global num  # 声明使用全局变量
    num = 20
    print(num)

test()
print(num)

# 局部变量:仅函数内部生效
def func():
    a = 100
    print(a)
# print(a) 外部无法访问

十一、异常处理

作用:捕获错误,防止程序崩溃

try:
    # 可能报错的代码
    print(1 / 0)
except ZeroDivisionError:
    print("除数不能为0")
except Exception as e:
    print("未知错误:", e)
else:
    print("无异常时执行")
finally:
    print("无论是否报错都执行")

十二、模块与包

作用:导入内置/第三方/自定义模块,复用代码

# 导入完整模块
import math
print(math.pi)
print(math.sqrt(4))

# 导入指定功能
from math import pow
print(pow(2,3))

# 别名导入
import math as m

# 导入自定义模块
import test

十三、文件IO操作

# 写入文件(w覆盖 / a追加)
with open("test.txt", "w", encoding="utf-8") as f:
    f.write("测试写入内容")

# 读取文件
with open("test.txt", "r", encoding="utf-8") as f:
    text = f.read()
    print(text)

# 按行读取
with open("test.txt", "r", encoding="utf-8") as f:
    for line in f.readlines():
        print(line.strip())

十四、面向对象(Python核心)

作用:封装、继承、多态,模块化编程

1. 基础类与实例

# 定义类
class Person:
    # 构造方法(初始化)
    def __init__(self, name, age):
        self.name = name
        self.age = age

    # 成员方法
    def say(self):
        print(f"姓名:{self.name},年龄:{self.age}")

# 实例化对象
p = Person("小明", 18)
p.say()

2. 类继承

# 子类继承父类
class Student(Person):
    def __init__(self, name, age, stu_id):
        super().__init__(name, age) # 调用父类构造
        self.stu_id = stu_id

    def study(self):
        print(f"{self.name}正在学习")

s = Student("小红", 16, "001")
s.say()
s.study()

十五、常用高阶语法

1. 列表推导式(极简生成列表)

# 生成1-10偶数列表
lst = [x for x in range(1,11) if x % 2 == 0]
print(lst)

2. map/filter 高阶函数

# map:批量处理元素
lst = [1,2,3]
res = list(map(lambda x:x*2, lst))
print(res)

# filter:过滤元素
res2 = list(filter(lambda x:x>1, lst))
print(res2)

十六、迭代器与生成器

# 生成器(节省内存)
def gen():
    yield 1
    yield 2
    yield 3

g = gen()
print(next(g))
print(next(g))

十七、多线程/多进程(简易用法)

# 简易多线程
import threading
import time

def task():
    print("线程执行")
    time.sleep(1)

t = threading.Thread(target=task)
t.start()
t.join()

python进阶版

Lua 极简完整教程(全知识点+纯用法)

说明:全文无冗余描述,每项只写:作用 + 标准代码写法,可直接复制运行。覆盖Lua入门到进阶全部核心知识点。

一、基础语法规则

1. 注释

作用:代码备注,不执行

-- 单行注释

--[[
多行注释
多行注释
]]

2. 语句规则

作用:代码书写规范

  • Lua 可省略分号,不报错
  • 大小写敏感:a 和 A 是两个变量
  • 标识符:字母/下划线开头,后跟字母、数字、下划线

3. 打印输出

作用:控制台打印内容

print("Hello Lua")
print(123, true, nil)

二、八大数据类型

作用:Lua所有数据仅有8种类型,type()查看类型

-- 1. nil 空值(默认未赋值变量)
local a = nil

-- 2. boolean 布尔
local b = true
local c = false

-- 3. number 数字(整数/小数统一类型)
local d = 100
local e = 3.14

-- 4. string 字符串
local str1 = "双引号字符串"
local str2 = '单引号字符串'
local str3 = [[
多行
字符串
]]

-- 5. table 表(数组+字典,Lua唯一容器)
local t = {}

-- 6. function 函数
local f = function() end

-- 7. userdata 自定义C数据(极少用)
-- 8. thread 协程线程

-- 查看类型
print(type(a)) -- nil
print(type(str1)) -- string

三、变量(全局/局部)

作用:存储数据,局部变量优先使用(效率高、不污染全局)

-- 全局变量:任意位置访问,默认全局
g_num = 100

-- 局部变量:仅当前代码块有效,local声明
local l_num = 200

-- 多变量赋值
local x, y, z = 1, 2, 3

-- 变量默认值 nil
local empty
print(empty) -- nil

四、运算符

1. 算术运算符

local a = 10
local b = 3
print(a + b)  -- 加
print(a - b)  -- 减
print(a * b)  -- 乘
print(a / b)  -- 除(浮点)
print(a % b)  -- 取余
print(a ^ b)  -- 幂运算
print(-a)     -- 负号

2. 关系运算符

返回 true/false

print(10 == 10)  -- 等于
print(10 ~= 3)   -- 不等于(Lua独有 ~=)
print(10 > 3)   -- 大于
print(10 < 3)   -- 小于
print(10 >= 3)  -- 大于等于
print(10 <= 3)  -- 小于等于

3. 逻辑运算符

Lua逻辑:and / or / not,无\&\& || \!

print(true and false) -- 与
print(true or false)  -- 或
print(not true)       -- 非

-- 短路特性(常用赋值技巧)
local n = nil
local res = n or 100 -- n为空则取100(默认值赋值)

4. 字符串拼接

符号:..

local s = "Lua" .. "学习"
print(s) -- Lua学习

五、流程控制

1. if 条件判断

-- 单分支
local a = 10
if a > 5 then
    print("大于5")
end

-- 双分支
if a > 20 then
    print("大")
else
    print("小")
end

-- 多分支
if a < 5 then
    print("小")
elseif a < 15 then
    print("中")
else
    print("大")
end

2. for 循环

-- 数值for:起始,结束,步长(步长默认1)
for i=1,5 do
    print(i) -- 1 2 3 4 5
end

for i=1,10,2 do
    print(i) -- 1 3 5 7 9
end

3. while 循环

local i = 1
while i <= 3 do
    print(i)
    i = i + 1
end

4. repeat until 循环

特点:先执行后判断,至少执行一次

local i = 1
repeat
    print(i)
    i = i + 1
until i > 3

5. 循环跳转

-- break:跳出当前循环
for i=1,10 do
    if i == 3 then
        break
    end
    print(i)
end

-- Lua 无 continue,可通过 if 模拟

六、函数(核心)

作用:封装代码,复用逻辑,支持多返回值

1. 基础函数

-- 定义
local function add(a,b)
    return a + b
end

-- 调用
print(add(2,3)) -- 5

2. 多返回值

local function getPos()
    return 10, 20
end
local x,y = getPos()
print(x,y)

3. 可变参数

作用:接收任意多个参数

local function sum(...)
    local res = 0
    for _,v in ipairs({...}) do
        res = res + v
    end
    return res
end
print(sum(1,2,3,4))

4. 匿名函数

local f = function(a,b)
    return a*b
end
print(f(2,5))

七、Table 表(Lua万能容器)

作用:唯一的数据容器,可当数组、字典、对象、结构体使用

1. 数组(有序列表,默认下标从1开始)

local arr = {"a","b","c"}
print(arr[1]) -- a
-- 遍历数组
for i,v in ipairs(arr) do
    print(i,v)
end

2. 字典(键值对)

local dict = {
    name = "Lua",
    age = 20
}
print(dict.name)
print(dict["age"])

-- 增改
dict.version = 5.4
-- 删除
dict.age = nil

3. 混合表 + 遍历

local t = {10,20,name="测试"}

-- 遍历所有键值对(万能遍历)
for k,v in pairs(t) do
    print(k,v)
end

4. 常用表操作

local arr = {1,2,3}
table.insert(arr,4)    -- 尾部插入
table.insert(arr,2,99) -- 指定下标插入
table.remove(arr,2)    -- 删除指定下标
print(#arr)            -- # 获取数组长度

八、字符串常用操作

local s = "LuaStudy"
print(#s)                 -- 字符串长度
print(string.upper(s))    -- 转大写
print(string.lower(s))    -- 转小写
print(string.find(s,"Lua"))-- 查找子串位置
print(string.sub(s,1,3))  -- 截取 1-3位
print(string.rep(s,2))    -- 重复2次
print(string.gsub(s,"Lua","Go")) -- 替换

九、迭代器遍历

  • ipairs:只遍历数字下标、连续数组,从1开始
  • pairs:遍历所有键值对(数组、字典全部遍历)
local t = {11,22,name="test"}
for i,v in ipairs(t) do print(i,v) end
for k,v in pairs(t) do print(k,v) end

十、作用域

作用:区分变量生效范围

local a = 10 -- 全局局部(文件级)
if true then
    local a = 20 -- 代码块局部,仅内部生效
    print(a) -- 20
end
print(a) -- 10

十一、异常处理

作用:捕获代码错误,防止程序崩溃

local ok, err = pcall(function()
    -- 可能报错的代码
    print(1/0)
end)
if not ok then
    print("错误:",err)
end

十二、模块与require

作用:引入外部lua文件,代码模块化

-- 引入同目录模块
local m = require("test")
-- 卸载模块
package.loaded["test"] = nil

十三、协程(Lua核心特性)

作用:轻量级线程,可暂停、恢复执行

-- 创建协程
local co = coroutine.create(function()
    print("协程执行")
    coroutine.yield() -- 暂停
    print("协程恢复")
end)

coroutine.resume(co) -- 启动
coroutine.resume(co) -- 恢复

十四、常用系统工具

-- 随机数
math.randomseed(os.time()) -- 随机种子
print(math.random(1,10))

-- 数学函数
print(math.floor(3.9)) -- 向下取整
print(math.ceil(3.1))  -- 向上取整
print(math.max(1,9))

-- 获取当前时间
print(os.time())

十五、元表与元方法(进阶)

作用:给table添加重载行为、自定义操作

local t1 = {1,2}
local mt = {
    __add = function(a,b)
        return {a[1]+b[1], a[2]+b[2]}
    end
}
setmetatable(t1,mt)
local t2 = {3,4}
local res = t1 + t2 -- 重载加法
print(res[1],res[2])

十六、面向对象(Lua模拟)

作用:用table+元表实现类与继承

-- 定义类
local Person = {}
Person.__index = Person

-- 构造方法
function Person.new(name,age)
    local self = setmetatable({},Person)
    self.name = name
    self.age = age
    return self
end

-- 成员方法
function Person:say()
    print(self.name,self.age)
end

-- 实例化
local p = Person.new("小明",18)
p:say()

十七、文件IO

-- 写文件
local f = io.open("test.txt","w")
f:write("测试内容")
f:close()

-- 读文件
local f = io.open("test.txt","r")
local str = f:read("*a")
print(str)
f:close()

lua进阶版

类文件物理存在,但Yii自动加载找不到,高级模板新建独立api应用,99%是缺少 @api 别名,Yii autoload靠别名映射,不是composer psr‑4。

根因说明

Yii2高级模板:

  • @frontend@backendcommon/config/bootstrap.php 预先注册别名。
  • 你手动新建的api应用,没有注册 @api 别名
    当解析 api\controllers\TemplateController
    Yii自动加载逻辑:@api/controllers/TemplateController.php,别名@api不存在 → 直接放弃加载,class_exists返回false,哪怕磁盘上文件真实存在。

修复步骤

1、注册@api别名(必须)

打开 common/config/bootstrap.php,追加一行:

Yii::setAlias('@api', dirname(__DIR__) . '/api');
frontend/backend就是在这里注册别名,api同样需要这里注册,不是写在api/config/main.php里面,main.php的aliases不参与引导阶段自动加载。

2、核对 api/config/main.php

return [
    'id' => 'api',
    'basePath' => dirname(__DIR__),
    // 这里命名空间严格 api\controllers
    'controllerNamespace' => 'api\controllers',
    // 这里不要写 aliases 数组做@api,此处加载时机太晚,autoload阶段还没执行
    // ...其余配置
];

3、验证调试代码,放到 api/web/index.php 最顶部

<?php
// 打印别名路径,看是否指向正确api目录
var_dump(Yii::getAlias('@api'));

$cls = 'api\controllers\TemplateController';
var_dump($cls, class_exists($cls));

// 手动拼装Yii预期的文件路径
$file = Yii::getAlias('@api/controllers/TemplateController.php');
var_dump($file, file_exists($file));

die;
  • Yii::getAlias('@api') 如果抛出异常:别名没注册,就是上面bootstrap漏写。
  • file_exists($file)=true,但是class_exists=false:确认别名生效,Yii自动加载器依然不去include该文件。

4、其他踩坑点

  1. 大小写严格TemplateController.php文件名、类名完全一致;Linux区分大小写,Windows会掩盖问题。
  2. 控制器文件第一行 namespace api\controllers; 末尾分号不能丢。
  3. opcache缓存:修改bootstrap.php后,重启php‑fpm,清除opcache,否则旧别名常驻内存。
  4. 不要用frontend入口访问api,浏览器访问必须是 api/web/index.php

临时快速验证(强制类映射,用来确认问题)

api/config/main.php配置加入,写死类映射,如果访问正常,100%确认是别名/autoload问题:

return [
    // ...
    'classMap' => [
        'api\controllers\TemplateController' => '@api/controllers/TemplateController.php',
        'api\controllers\DefaultController' => '@api/controllers/DefaultController.php',
    ],
];
加上classMap之后访问正常,说明物理文件完全没问题,就是Yii自动加载阶段找不到@api别名。

排查顺序

  1. common/config/bootstrap.php 是否添加 Yii::setAlias('@api',xxx)
  2. 重启php‑fpm,清除opcache
  3. index.php调试代码看Yii::getAlias('@api')输出路径
  4. 确认访问入口是api/web/index.php,不是frontend入口
高级模板独立应用,不是靠composer psr‑4自动加载,是Yii别名机制,很多人踩这个坑,文件放对,忘记注册别名,class_exists直接false。

要将已经由 Git 跟踪的目录加入忽略,必须先从 Git 缓存中移除该目录的追踪状态,再将其写入 .gitignore 文件。执行以下三个步骤即可完成:

操作步骤清除暂存区缓存:
运行命令

 git rm -r --cached 目录名

(注意这只会从 Git 记录中移除,不会删掉你本地电脑里的真实文件夹)。

添加至忽略文件:

打开或创建根目录下的 .gitignore 文件,在里面写上你的目录名字,例如 目录名/。

提交这一改动:运行 git add .gitignore 和 git commit -m "stop tracking 目录名" 把修改保存到仓库中。

.gitignore 格式规则

基础语法

# 这是注释,#开头
# 忽略指定文件
test.log

# 忽略整个目录(末尾带 / 代表文件夹)
node_modules/

# 忽略该目录下所有文件,不忽略目录本身
dist/*

# ! 取反,不忽略(例外),必须写在被忽略规则后面
!dist/index.html

# * 通配任意字符
*.log

# ** 递归匹配多级目录
**/temp.txt     # 所有层级下的 temp.txt
**/build/       # 任意位置 build 文件夹

# ? 匹配单个字符
file?.txt

重要坑点

  1. /xxx 开头斜杠:只匹配仓库根目录,不会递归子目录
    /vendor/ 只忽略根下vendor,子文件夹vendor不会生效
  2. 已经被git追踪过的文件,写.gitignore不会自动取消跟踪,需要手动:

    git rm --cached 文件名
  3. 规则从上往下解析,后面的规则优先级更高;! 要放在屏蔽规则之后。

PHP/Yii2 最简示例模板

# 日志
*.log
runtime/
web/assets/

# IDE
.idea/
.vscode/

# 依赖
vendor/

# 环境配置
.env
config/db-local.php

# os文件
.DS_Store
Thumbs.db

生效位置

  • 仓库根目录 .gitignore 全局生效(最常用)
  • 子文件夹内也可以放 .gitignore,只对当前文件夹及下级生效。

需要我给你一份Yii2项目完整可直接复制的.gitignore吗。