为什么在Lua中,表字面量与表引用会被不同地处理?
2013-10-13 5:55:58
收藏:0
阅读:123
评论:2
以下是Lua 5.2.2的记录,显示了一个表的声明和索引:
> mylist = {'foo', 'bar'}
> print(mylist[1])
foo
为什么以下语句不合法?
> print({'foo', 'bar'}[1])
stdin:1: ')' expected near '['
我想不到还有其他语言中文字面量不能替换引用(当然,除非需要lvalue)。
FWIW,将表的文字用括号括起来就可以使语句合法:
> print(({'foo', 'bar'})[1])
foo
点赞
用户2633423
这也与 Lua 中这种语法是有效的事实相关:
myfunc { 1, 2, 3 }
等同于:
myfunc( { 1, 2, 3 } )
因此,例如此表达式:
myfunc { 1, 2, 3 } [2]
被解析为:
myfunc( { 1, 2, 3 } )[2]
因此,首先计算函数调用,然后进行索引操作。
如果 {1,2,3}[2] 可被解析为有效的索引操作,它可能会导致前面式子中的歧义情况,需要更多的前瞻。Lua 团队选择通过让 Lua 字节码编译器成为一次单独的编译器,使其快速扫描源代码,只需最少的前瞻。该信息来源于 Lua 开发者 Roberto Ierusalimschy 的邮件列表信息。
字符串文本和方法调用也存在同样的问题。这是无效的:
"my literal":sub(1)
但是这是有效的:
("my literal"):sub(1)
同样,Lua 允许这种操作:
func "my literal"
等同于:
func( "my literal" )
2013-10-12 08:39:35
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
根据 这里 定义的语法规则,非括号版本无效而括号版本有效的原因是因为语法树采用了不同的路径,期望有一个关闭括号
),因为在那个上下文中 应该 没有其他符号。在第一个案例中:
functioncall ::= prefixexp args | prefixexp `:´ Name args prefixexp => prefixexp ::= var | functioncall | `(´ exp `)´ var -> print 因此 prefixexp -> print args => args ::= `(´ [explist] `)´ | tableconstructor | String 匹配 '(' explist => explist ::= {exp `,´} exp exp => exp ::= nil | false | true | Number | String | `...´ | function | prefixexp | tableconstructor | exp binop exp | unop exp tableconstructor => explist-> {'foo','bar'} 因此 explist = {'foo','bar'} 匹配 ')' 错误!!!发现 '[' 预期 ')'另一方面,使用括号:
functioncall ::= prefixexp args | prefixexp `:´ Name args prefixexp => prefixexp ::= var | functioncall | `(´ exp `)´ var -> print 因此 prefixexp -> print args => args ::= `(´ [explist] `)´ | tableconstructor | String 匹配 '(' explist => explist ::= {exp `,´} exp exp => exp ::= nil | false | true | Number | String | `...´ | function | prefixexp | tableconstructor | exp binop exp | unop exp prefixexp => prefixexp ::= var | functioncall | `(´ exp `)´ var => var ::= Name | prefixexp `[´ exp `]´ | prefixexp `.´ Name prefixexp => prefixexp ::= var | functioncall | `(´ exp `)´ 匹配 '(' exp => exp ::= nil | false | true | Number | String | `...´ | function | prefixexp | tableconstructor | exp binop exp | unop exp tableconstructor => 因此 exp = {'foo','bar'} 匹配 ')' 因此 prefixexp = ({'foo','bar'}) 匹配 '[' exp => Number = 1 匹配 ']' 因此 VAR = ({'foo','bar'})[1] 因此 prefixexp = VAR 因此 exp = VAR 因此 explist = VAR 匹配 ')' 因此 args = (VAR) => print(VAR)