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