Lua练习16.1:loadwithprefix函数实现报错求解决方案
解决Lua练习16.1的loadwithprefix实现问题
问题分析
你的代码存在多个逻辑和语法错误,导致无法正确传递参数并加载代码块:
- 变量名拼写错误:
prfxflg应为prefixflg,直接导致逻辑判断完全失效 - 读取器逻辑颠倒:没有实现"先返回前缀再返回原代码块"的核心要求
- 未定义函数引用:错误使用不存在的
code(),应调用传入的chunk读取器 - 函数结构错误:
loadwithprefix应返回load加载后的可执行函数,而非嵌套返回函数的结构 - 参数传递错误:试图通过环境表传递参数,正确做法是在调用加载后的函数时直接传入参数
正确实现代码
function loadwithprefix(prefix, chunk) -- 将chunk统一转换为读取器函数:兼容字符串和函数两种输入 local reader if type(chunk) == "string" then local has_returned = false reader = function() if not has_returned then has_returned = true return chunk end return nil end else reader = chunk -- 输入已是读取器函数,直接使用 end -- 包装读取器:先返回前缀,再返回原代码块内容 local returned_prefix = false return load(function() if not returned_prefix then returned_prefix = true return prefix else return reader() end end) end -- 测试代码 local line = io.read() local f = loadwithprefix('local x = ...; return x', function() return line end) for i = 1, 10 do print(string.rep('*', f(i))) end
关键修正点说明
- 统一读取器格式:把输入的字符串或函数都转换为标准读取器函数,简化后续包装逻辑
- 前缀优先返回:包装后的读取器第一次调用返回前缀代码,后续调用返回原代码块内容,直到返回nil结束
- 正确传递参数:加载后的函数调用时传入
i,前缀代码中的...会捕获该参数并返回,直接用于string.rep - 移除冗余环境表:不需要自定义环境,默认全局环境即可满足需求
测试说明
假设你输入的line内容为return x(或其他依赖x的代码),运行循环时会正确接收i值,输出对应数量的*。
内容的提问来源于stack exchange,提问作者kos
相关产品推荐
相关产品推荐

