【问题标题】:unpack function issue in LuaLua中的解包功能问题
【发布时间】:2014-12-14 05:20:20
【问题描述】:

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

【问题讨论】:

  • 如果不是最后一个尾随表达式,则多个返回值将被截断为第一个值。

标签: lua lua-table


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案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
    

    于浩的回答显示了这如何特别适用于您的示例。

    【讨论】:

      【解决方案3】:

      函数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 
      

      【讨论】:

      • {unpack(t)}:这段代码由英特尔赞助。
      猜你喜欢
      • 2015-02-21
      • 2021-01-03
      • 2016-04-01
      • 1970-01-01
      • 2021-02-09
      • 2017-09-07
      • 2021-12-12
      • 1970-01-01
      • 2016-03-20
      相关资源
      最近更新 更多