我从关于lua的官方书中得到了这个作业: 练习16.1:通常,在加载代码块时添加一些前缀是很有用的。 (我们在本章前面看到了一个例子,其中我们为正在加载的表达式添加了 return 前缀。)编写一个函数 loadwithprefix ,它的工作方式与 load 类似,只不过它将额外的第一个参数(一个字符串)添加为正在加载的块的前缀。已加载。 与原始加载一样,loadwithprefix 应该接受表示为字符串和读取器函数的块。即使在原始块是字符串的情况下,loadwithprefix 实际上也不应该将前缀与块连接起来。相反,它应该使用适当的读取器函数调用 load,该函数首先返回前缀,然后返回原始块。
function loadwithprefix(prefix, chunk)
local prefixflg = true
return function(...)
if prefixflg then
prefixflg = false
return load(prefix)
else
return chunk()
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
我得到:“rep”的错误参数#2(预期数字,为零)意味着我无法评估本地 x = ...; return x 实际上从 for 循环语句中返回 1。有什么建议吗?
您的
loadwithprefix
实施不正确:
您返回一个函数。这不是你应该做的。您应该使用函数调用 load,而不是返回调用 load 的函数。
该函数也没有多大意义:第一次调用它时,它仅加载前缀,并返回结果函数。第二次,它返回
chunk
返回的第一个值 - 如果 chunk
是一个正确的“读取器”,则不是函数。它也无法解释 chunk
是一个字符串。
您的测试代码还有一个小缺陷:如果
f(i)()
正确实现,f(i)
应该只是 loadwithprefix
。 (我也不太明白前缀的意思。你希望你的后缀是像+ 42
这样的东西吗?)
这是我的实施方式
loadwithprefix
:
local function loadwithprefix(prefix, chunk, ...)
local loaded_prefix = false
return load(function()
-- first read the prefix
if not loaded_prefix then
loaded_prefix = true
return prefix
end
if type(chunk) == "string" then
local str = chunk -- remember the string
chunk = function() end -- return nothing the next time
return str
end
return chunk() -- delegate to the original reader
end, ...)
end
...
是传递 mode
和 env
参数(以及将来可能添加的任何其他内容)。