Menu
CoddyTech

回顾:安全保险库

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

challenge icon

挑战

简单

让我们构建一个使用基于闭包的隐私保护的 Vault 类,创建真正安全的存储系统!保险库会保存秘密内容,只有提供正确的密码才能访问。

你需要将代码分成两个文件:

  • Vault.lua:创建一个类,在构造函数中将内容和密码都存储为局部变量,完全隐藏它们,不让外部访问。构造函数 :new(contents, password) 应将这些值存储在局部变量中,然后直接在对象实例上定义一个方法:
    • :open(attemptedPassword):检查尝试输入的密码是否与存储的密码匹配。如果匹配,就返回秘密内容。如果不匹配,就返回 "Access Denied"。
  • main.lua:引入你的 Vault 模块,并读取三个输入:要存储的秘密内容、要设置的密码,以及一次密码尝试。使用内容和密码创建一个保险库,然后尝试用输入的密码打开它,并打印结果。还要尝试直接访问 vault.contents 并打印结果,以此证明内容确实是私有的。

你会收到三个输入:

  1. 要存储在保险库中的秘密内容
  2. 用于保护保险库的密码
  3. 尝试打开保险库时输入的密码

你的输出应该有两行:

Result: {resultFromOpen}
Direct access: {whatYouGetFromVaultContents}

例如,如果输入是 Gold Coins、secret123 和 secret123,输出应该是:

Result: Gold Coins
Direct access: nil

如果输入是 Diamond、mypass 和 wrongpass,输出应该是:

Result: Access Denied
Direct access: nil

关键在于,contents 和 password 都只作为构造函数中的局部变量存在。:open() 方法可以通过闭包访问它们,但其他任何东西都无法访问它们,甚至包括 vault.contents、vault._contents 或 vault.password。这就是真正的封装!

亲手试试

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

-- 读取输入
local contents = io.read()
local password = io.read()
local attemptedPassword = io.read()

-- TODO: 用 contents 和 password 创建一个保险库

-- TODO: 尝试用 attemptedPassword 打开保险库

-- TODO: 按以下格式打印结果:"Result: {resultFromOpen}"

-- TODO: 尝试直接访问 vault.contents,并打印获取到的内容
-- 按以下格式打印:"Direct access: {whatYouGetFromVaultContents}"

面向对象编程中的所有课

自己练习: Lua 在线编译器