首页 > 解决方案 > Lua中pairs()的“类型签名”是什么?

问题描述

查看“Lua 编程”中的第7.1 章 – 迭代器和闭包,似乎for foo in bar循环需要bar为类型(使用 Java 类型来表达它)Supplier<Tuple>,并且for-in将继续调用bar直到它返回nil

所以对于类似的东西:

for k,v in pairs( tables ) do
    print( 'key: '..k..', value: '..v )
end

这意味着pairs有一种Function<Table,Supplier<Tuple>>.

我想创建一个行为类似的函数,pairs 除了它跳过第一个参数以下划线开头的元组(即_)。

local function mypairs( list )
    local --[[ Supplier<Tuple> ]] pairIterator = pairs( list )
    return --[[ Supplier<Tuple> ]] function ()
        while true do
            local key, value = pairIterator()
            if key == nil then
                return nil
            elseif key:sub(1,1) ~= '_' then
                return key, value
            end
        end
    end
end

但是它不起作用,因为

--[[should be: Supplier<Table>]] pairIterator = pairs({ c=3; b=2; a=1 })

当我调用它时

pairIterator()

它返回

stdin:1: bad argument #1 to 'pairIterator' (table expected, got no value)
stack traceback:
    [C]: in function 'pairIterator'
    stdin:1: in main chunk
    [C]: in ?

pairIterator({ c=3; b=2; a=1 })

返回

Lua>pairIterator({ c=3; b=2; a=1 })
c       3

标签: lua

解决方案


您的基本问题是您在 Lua 问题上使用 Java 逻辑。Java 和 Lua 是具有不同结构的不同语言,认识到这一点很重要。

pairs没有返回值;它有多个返回值。这是Java完全缺乏的一个概念。ATuple是可以存储和操作多个值的单个值。Lua 函数可以返回多个值。这在语法和语义上与返回包含多个值的表不同。

基于迭代器的for语句将多个值作为其输入,而不是包含多个值的表或容器。具体来说,它存储 3 个值:一个迭代器函数、一个状态值(用于在调用之间保留状态)和一个初始值。

所以,如果你想模仿pairs的行为,你需要能够存储和操作它的多个返回值。

您的第一步是存储pairs实际返回的内容:

local f, s, var = pairs(list)

您正在创建一个新的迭代器函数。所以你需要返回那个,但你需要返回那个返回的s和。您的退货声明需要如下所示:varpairs

return function (s, var)
    --[[Contents discussed below]]
end, s, var --Returning what `pairs` would return.

现在,在您的函数内部,您需要f使用sand调用var。此函数将返回键/值对。您需要正确处理它们:

return function (s, var)
    repeat
        local key, value = f(s, var)
        if(type(key) ~= "string") then
            --Non-string types can't have an `_` in them.
            --And no need to special-case `nil`.
            return key, value
        elseif(key:sub(1, 1) ~= '_') then
            return key, value
        end
    until true
end, s, var --Returning what `pairs` would return.

推荐阅读