Lua中基于代理实现Account双表示的方案正确性问询
关于《Programming in Lua, 4th edition》第21章习题实现的验证建议
要判断你的实现是否符合题目要求,得先看你写的具体代码实现。不过先帮你明确这道题的核心要求关键点,你可以先自行核对:
- 每个Account对象必须是空代理表,外部无法直接访问存储状态的内部表
- 需要一个用
local修饰的内部映射表(确保外部不可见),用来关联代理表和对应的状态存储表 - 所有类方法执行时,必须把传入的
self(代理表)转换为对应的内部状态表后再操作 - 代理表要通过元方法(比如
__index、__newindex)拦截外部的访问操作,转向内部状态表
下面给一个符合要求的简化示例,你可以用来和自己的实现对比:
-- 内部映射表,外部无法访问 local internal_states = {} local Account = {} Account.__index = Account function Account:new(initial_balance) -- 空代理表作为对外暴露的对象 local proxy = {} -- 存储对象状态的内部表 local state = {balance = initial_balance or 0} -- 关联代理和状态表 internal_states[proxy] = state setmetatable(proxy, Account) return proxy end function Account:deposit(amount) -- 将代理self转换为实际状态表 local state = internal_states[self] state.balance = state.balance + amount end function Account:withdraw(amount) local state = internal_states[self] if state.balance >= amount then state.balance = state.balance - amount return true end return false end function Account:get_balance() local state = internal_states[self] return state.balance end -- 测试示例 local acc = Account:new(100) acc:deposit(50) print(acc:get_balance()) -- 输出 150 -- 外部无法直接访问内部状态:print(acc.balance) 会输出 nil
把你的实现代码贴出来,我就能帮你判断是否符合题意,以及和书中示例的差异是否合理。
内容的提问来源于stack exchange,提问作者LRDPRDX
相关产品推荐
相关产品推荐

