Lua中的解压函数问题

我有以下的 unpack() 函数:

function unpack(t, i)
    i = i or 1
    if t[i] then
        return t[i], unpack(t, i + 1)
    end
end

我现在在以下测试代码中使用它:

 t = {"one", "two", "three"}
print (unpack(t))
print (type(unpack(t)))
print (string.find(unpack(t), "one"))
print (string.find(unpack(t), "two"))

输出结果如下:

one two three
string
1   3
nil

令我困惑的是最后一行,为什么结果是 nil

点赞
用户1009479
用户1009479

如果一个函数返回多个值,除非它是作为最后一个参数使用,否则只会取第一个值。

在你的例子中,string.find(unpack(t), "one")string.find(unpack(t), "two")"two""three"被丢弃了,它们等同于:

string.find("one", "one")  --3

string.find("one", "two")  --nil
2014-12-12 02:41:58
用户234175
用户234175

5.1 - Multiple Results中,Lua Pil如下所述:

Lua总是根据调用情况调整函数的结果数量。当我们将一个函数作为语句调用时,Lua会丢弃其所有结果。当我们将调用作为表达式使用时,Lua只保留第一个结果。只有当调用是表达式列表中的最后一个(或唯一一个)表达式时,我们才会获得所有结果。这些列表在Lua中出现在四个构造中:多重赋值、函数调用的参数、表构造和返回语句。

它给出了以下示例以帮助说明:

function foo0 () end                  -- 不返回任何结果
function foo1 () return 'a' end       -- 返回1个结果
function foo2 () return 'a','b' end   -- 返回2个结果

x, y = foo2(), 20      -- x='a', y=20
x, y = foo0(), 20, 30  -- x='nil',y=20,30被丢弃

余昊的答案展示了如何将其应用于你的示例。

2014-12-12 03:10:02
用户4261756
用户4261756

unpack 函数返回多个参数,而 string.find 函数只使用第一个参数(其他参数被舍弃)。

此函数将解包并连接所有字符串,所以函数输出将成为一个单一的参数。

function _unpack(t,char)
    return table.concat(t,(char or " "));
end
t = {"one", "two", "three"}
print (_unpack(t))
print (type(_unpack(t)))
print (string.find(_unpack(t), "one"))
print (string.find(_unpack(t), "two"))

输出:

one two three
string
1 3
5 7
2014-12-13 17:24:07