Menu
CoddyTech

获取方法

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

你已经学会了如何将数据存储在 self.health 或 self.items 这样的实例变量中。虽然你可以从对象外部直接访问这些字段,但还有一种更简洁的方式:使用getter 方法。

getter(也称为访问器方法)是一种简单的方法,用于返回内部值。你不直接访问 player.health,而是调用 player:getHealth():

local Player = {}
Player.__index = Player

function Player:new(name)
    local instance = {}
    setmetatable(instance, self)
    instance.name = name
    instance.health = 100
    return instance
end

function Player:getHealth()
    return self.health
end

function Player:getName()
    return self.name
end

为什么还要多一个方法?Getter 为访问数据提供了受控入口。

目前,:getHealth() 只是返回值。不过之后,你可能想添加一些逻辑:比如,当生命值降到 10 以下时返回 "Critical",或者每次检查生命值时都记录日志。

有了 getter,你就可以进行这些更改,而无需修改任何使用该对象的代码。

local hero = Player:new("Luna")
print(hero:getHealth())  -- 输出:100
print(hero:getName())    -- 输出:Luna

这种模式在对象的内部结构与其他代码和它交互的方式之间划定了清晰的界限。外部代码通过方法获取数据,而不是直接访问对象的字段。

challenge icon

挑战

简单

让我们来创建一个使用 getter 方法访问内部数据的 Player 类。你不会直接读取玩家的字段,而是创建一些方法,以受控的方式访问玩家的信息。

你会将代码分为两个文件:

  • Player.lua:使用标准原型模式定义 Player 类。构造函数应接收一个名字,并将生命值初始化为 100。添加三个 getter 方法:
    • :getName() 返回玩家的名字
    • :getHealth() 返回玩家当前的生命值
    • :getStatus() 返回一个组合这两项信息的格式化字符串
  • main.lua:引入你的 Player 模块并创建一个玩家实例。使用 getter 方法显示玩家的信息:通过方法访问所有信息,而不是直接读取字段。

你的 :getStatus() 方法应返回符合以下格式的字符串:

[name] has [health] HP

你会收到一个输入:玩家的名字。

在主文件中,使用给定的名字创建一个玩家,然后使用 getter 方法打印三行:

  1. 玩家的名字(使用 :getName())
  2. 玩家的生命值(使用 :getHealth())
  3. 玩家的完整状态(使用 :getStatus())

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

Luna
100
Luna has 100 HP

亲手试试

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

-- 读取输入
local name = io.read()

-- TODO:用给定的名字创建一个玩家实例

-- TODO:使用 :getName() 输出玩家的名字

-- TODO:使用 :getHealth() 输出玩家的生命值

-- TODO:使用 :getStatus() 输出玩家的状态
quiz icon自我测试

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

面向对象编程中的所有课

自己练习: Lua 在线编译器