无法从字符串加载()返回值

问题描述 投票:0回答:1

我从关于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。有什么建议吗?

lua load return-value
1个回答
0
投票

您的

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
参数(以及将来可能添加的任何其他内容)。

© www.soinside.com 2019 - 2024. All rights reserved.