跳转至内容

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

自动导入

因为教程里的 isFileisDirectory 在 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
end

snake_case

给自己定一个命名规范,之后一切都是 snake_case,包括文件名、类名、函数名、变量名全部小写+下划线。