设置方法
本课属于 Coddy Lua 学习旅程的“面向对象编程”单元。第 14 课,共 70 课。
Getter 方法让你通过受控的访问点读取内部数据。Setter 方法(也称为修改器方法)则恰恰相反。它们提供了一种受控的方式来修改内部状态。
你不直接赋值 car.speed = 50,而是调用 car:setSpeed(50):
local Car = {}
Car.__index = Car
function Car:new()
local instance = {}
setmetatable(instance, self)
instance.speed = 0
return instance
end
function Car:setSpeed(newSpeed)
self.speed = newSpeed
end
function Car:getSpeed()
return self.speed
end乍一看,这似乎只是为了得到相同的结果而增加了工作量。但当你之后需要添加规则时,setter 就会变得很有用。假设你想确保速度不会小于 0,也不会超过最大值:
function Car:setSpeed(newSpeed)
if newSpeed < 0 then
self.speed = 0
elseif newSpeed > 200 then
self.speed = 200
else
self.speed = newSpeed
end
end现在,每次速度变化都会经过你的验证逻辑。任何使用 :setSpeed() 的代码都能自动应用这些检查,无需修改。这就是 setter 的真正价值。它们提供了一个统一的入口,让你控制数据如何变化,使对象更安全,也更易于维护。
挑战
简单让我们来编写一个 Thermostat 类,通过 setter 方法智能地控制温度。温控器不会接受任意温度值,而是会设置合理的限制,让温度保持在舒适的范围内。
你需要将代码分成两个文件:
Thermostat.lua:使用标准的原型模式定义Thermostat类。每个温控器都应跟踪当前的temperature。其中包括:- 一个
:new()构造函数,将温度初始化为20(一个舒适的默认值) - 一个
:getTemperature()getter,返回当前温度 - 一个
:setTemperature(newTemp)setter,用于更新温度,但温度必须保持在限制范围内:最低为10,最高为30
- 一个
main.lua:导入 Thermostat 模块并创建一个温控器实例。使用 setter 尝试更改不同的温度,观察这些限制如何生效。
你的 :setTemperature() 方法应遵循以下规则:
- 如果新温度低于
10,就将其设为10 - 如果新温度高于
30,就将其设为30 - 否则,将其设为请求的值
你会收到两个输入:
- 要设置的第一个温度
- 要设置的第二个温度
在主文件中创建一个温控器,然后:
- 输出初始温度
- 将温度设为第一个输入值,并输出结果
- 将温度设为第二个输入值,并输出结果
每个温度单独占一行输出(只输出数字)。
例如,如果输入是 25 和 50,输出应为:
20
25
30注意,第二次尝试将温度设为 50 时,结果是 30:setter 会自动执行最高温度限制!
亲手试试
-- 加载 Thermostat 模块
local Thermostat = require('Thermostat')
-- 读取输入
local temp1 = tonumber(io.read())
local temp2 = tonumber(io.read())
-- TODO: 创建一个温控器实例
-- TODO: 打印初始温度
-- TODO: 将温度设置为 temp1 并打印结果
-- TODO: 将温度设置为 temp2 并打印结果
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: Lua 在线编译器