16. 类,自动导入,蛇形命名
3.12,因为 CS50G 2026 的版本开始更新了,暂缓 18 版本的学习,等全部出完之后速通。
classic
找方法:对象 → 元表 → __index → 类。
lua
local Object = {}
Object.__index = Object
function Object:new()
end
function Object:extend()
local cls = {}
for k, v in pairs(self) do
if k:find("__") == 1 then
cls[k] = v
end
end
cls.__index = cls
cls.super = self
setmetatable(cls, self)
return cls
end
function Object:implement(...)
for _, cls in pairs({...}) do
for k, v in pairs(cls) do
if self[k] == nil and type(v) == "function" then
self[k] = v
end
end
end
end
function Object:is(T)
local mt = getmetatable(self)
while mt do
if mt == T then
return true
end
mt = getmetatable(mt)
end
return false
end
function Object:__tostring()
return "Object"
end
function Object:__call(...)
local obj = setmetatable({}, self)
obj:new(...)
return obj
end
return Object自动导入
因为教程里的 isFile 和 isDirectory 在 11.0 已被弃用,改用 love.filesystem.getInfo。
lua
function love.load()
local objects_files = {}
recursive_enumerate("objects", objects_files)
require_files(objects_files)
end
function require_files(files)
for _, file in ipairs(files) do
require(file:sub(1, -5))
end
end
function recursive_enumerate(folder, file_list)
for _, item in ipairs(love.filesystem.getDirectoryItems(folder)) do
local path = folder .. "/" .. item
local info = love.filesystem.getInfo(path)
if info.type == "file" then
table.insert(file_list, path)
elseif info.type == "directory" then
recursive_enumerate(path, file_list)
end
end
endsnake_case
给自己定一个命名规范,之后一切都是 snake_case,包括文件名、类名、函数名、变量名全部小写+下划线。