这是一个Lua 5.2.2脚本,显示了表的声明和索引:
> mylist = {'foo','bar'} > print(mylist[1]) foo
以下声明为何不合法?@H_502_5@
> print({'foo','bar'}[1]) stdin:1: ')' expected near '['
我想不出任何其他语言,其中文字不能替代参考(当然,除非需要左值).@H_502_5@
FWIW,使表格文字具有括号,使声明合法:@H_502_5@
> print(({'foo','bar'})[1]) foo
解决方法
这也与Lua这个语法有效的事实有关:
myfunc { 1,2,3 }
它相当于:@H_502_5@
myfunc( { 1,3 } )
因此表达式如:@H_502_5@
myfunc { 1,3 } [2]
被解析为:@H_502_5@
myfunc( { 1,3 } )[2]
如果{1,3} [2]可以被解析为有效的索引操作,则可能导致前一个表达式中出现歧义,这需要更多的前瞻性. Lua团队选择通过使其成为单通道编译器来快速制作Lua字节码编译器,因此它只使用最少的前瞻扫描源代码一次.朝那个方向This message to lua mailing list from Roberto Ierusalimschy (lead Lua developer)点.@H_502_5@
字符串文字和方法调用存在同样的问题.这是无效的:@H_502_5@
"my literal":sub(1)
但这是有效的:@H_502_5@
("my literal"):sub(1)
再一次,Lua允许这样:@H_502_5@
func "my literal"
等同于此:@H_502_5@
func( "my literal" )