解压缩功能问题在Lua

时间:2014-12-12 02:33:28

标签: lua lua-table

我有以下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

3 个答案:

答案 0 :(得分:5)

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

在您的示例中,string.find(unpack(t), "one")string.find(unpack(t), "two")"two""three"被丢弃,它们相当于:

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

string.find("one", "two")  --nil

答案 1 :(得分:2)

Lua Pil在5.1 - Multiple Results

下有这个说法
  

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

它提供了以下示例来帮助说明:

function foo0 () end                  -- returns no results
function foo1 () return 'a' end       -- returns 1 result
function foo2 () return 'a','b' end   -- returns 2 results

x, y = foo2(), 20      -- x='a', y=20
x, y = foo0(), 20, 30  -- x='nil', y=20, 30 is discarded
余浩的回答显示了这是如何适用于你的榜样的。

答案 2 :(得分:0)

函数unpack返回multiply参数,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