Menu
CoddyTech

:new() 构造函数

本课属于 Coddy Lua 学习旅程的“面向对象编程”单元。第 8 课,共 70 课。

手动创建对象、创建空表、设置其元表并关联 __index,会变得重复。标准做法是在类中直接定义一个 :new() 构造方法,由它帮你处理所有这些操作。

模式如下:

local Dog = {}
Dog.__index = Dog

function Dog:new()
    local instance = {}
    setmetatable(instance, self)
    return instance
end

function Dog:bark()
    print("Woof!")
end

我们来拆解一下 :new() 内部发生了什么。首先,我们创建一个名为 instance 的空表。然后将它的元表设为 self,当我们调用 Dog:new() 时,self 就是 Dog。

由于 Dog.__index 指向 Dog 本身,因此实例可以找到在 Dog 中定义的所有方法。最后,我们返回这个新对象。

注意构造函数外部的这行代码:Dog.__index = Dog。这是一种常见的简便写法:无需创建单独的元表,类表既充当原型,也充当元表。

现在,创建对象既简洁又一致:

local myDog = Dog:new()
myDog:bark()  -- 输出:Woof!

你创建的每个类都会遵循相同的结构。:new() 构造函数会成为创建对象的唯一位置,让你的代码更有条理,也更容易预测。

challenge icon

挑战

简单

让我们使用你刚学过的标准构造函数模式来创建一个 Cat 类。你会把代码放在两个文件中,以练习正确的模块结构。

你将创建:

  • Cat.lua:定义 Cat 类,并实现完整的构造函数模式。你的类应包含:
    • 一个类表,其中的 __index 指向类表本身
    • 一个 :new() 构造函数,用于创建实例、设置它的元表并返回实例
    • 一个 :meow() 方法,用于打印猫的叫声
    在文件末尾返回类表。
  • main.lua:引入你的 Cat 模块,并使用构造函数创建一个猫实例。然后调用它的方法,以确认所有内容都已正确关联。

你会收到一个输入:猫应该叫几次。

你的 :meow() 方法应准确打印:

Meow!

在主文件中,使用 Cat:new() 创建一只猫,并按指定次数调用 :meow()。

例如,如果输入是 3,输出应为:

Meow!
Meow!
Meow!

亲手试试

-- 加载 Cat 模块
local Cat = require('Cat')

-- 读取输入:喵叫的次数
local times = tonumber(io.read())

-- TODO:使用 Cat:new() 创建一个猫实例

-- TODO:按指定次数调用 :meow() 方法
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: Lua 在线编译器