: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() 构造函数会成为创建对象的唯一位置,让你的代码更有条理,也更容易预测。
挑战
简单让我们使用你刚学过的标准构造函数模式来创建一个 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() 方法
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: Lua 在线编译器