Lua中括号为何会影响多值解包?
为什么给Lua的string:find调用加括号会影响多返回值的解包?
这是Lua的语法规则直接导致的——用括号包裹整个函数调用表达式时,Lua会强制把表达式的结果转换成单个值,只保留第一个返回值,剩下的全部丢弃。
先看正常的无括号场景:
> text = 'ciao pollo mario' > a, b = text:find('pollo') -- 无括号 > a, b 6 10
这里string:find返回两个值,Lua的赋值语句会自动把多返回值依次分配给变量列表里的a和b,所以两个变量都能拿到对应结果。
再看带括号的场景:
> a, b = ( text:find('pollo') ) -- 带括号 > a, b 6 nil
这里的括号把整个text:find('pollo')调用包裹成了一个单值表达式。根据Lua的语法,任何被括号包裹的表达式都会被“折叠”成单个值——不管原表达式返回多少个结果,最终只取第一个,剩下的直接丢弃。所以赋值时只有第一个返回值6被赋给a,b因为没有对应的值,就成了nil。
如果你确实想用括号提升可读性,别把整个函数调用包起来。比如可以给参数加括号:
a, b = text:find(('pollo')) -- 仅包裹参数,不影响多返回值
这样既保留了括号的可读性,又不会触发单值转换,a和b依然能拿到正确的两个返回值。
内容的提问来源于stack exchange,提问作者Dario Colombotto
相关产品推荐
相关产品推荐

