前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >理解lua语法

理解lua语法

作者头像
车雄生
发布2021-11-10 14:56:03
6070
发布2021-11-10 14:56:03
举报
文章被收录于专栏:咩嗒咩嗒

这篇文章源于我看到某乎某用户觉得lua语法“违反直觉”,我觉得有这感觉源于lua的语法糖,如果流于表面的把这些加糖后的语法往C,C#,java等语义上套确实容易产生误解。另外xLua群上也经常会问些因为对语法理解问题导致问题。

lua里头一些很常见的语法,其实都是加了糖。比如这个:

代码语言:javascript
复制
local a = {}
a.f = 10

去糖后其实是这样的,

代码语言:javascript
复制
local a = {}
a["f"] = 10

去糖后更清晰了,a是table,table本质上就是一个hashmap,我们往一个hashmap里头设置了键值对。

再看这个:

代码语言:javascript
复制
local calc = {}
function calc.add(a, b) --语法糖
end

第一次去糖后是这样:

代码语言:javascript
复制
local calc = {}
calc.add = function(a, b)
end

再按照文章开篇第一个语法糖再去一次糖,就变成了

代码语言:javascript
复制
local calc = {}
calc["add"] = function(a, b)
end

所以,仍然是对一个hashmap设置键值对,只不过值相对于c/c#/java比较特殊,这是个function(准确来说是一个closure),因为lua里头函数是first-class的,可以作为一个普通值来处理。

再来

代码语言:javascript
复制
function add(a, b)
    return a + b
end

一次脱糖

代码语言:javascript
复制
add = function(a, b)
    return a + b
end

二次脱糖就比较复杂,分两种情况:前面有local变量add,前面没有。

前面有local add,其实就是对add变量的一次赋值,如果没有,还要脱糖:

代码语言:javascript
复制
_ENV["add"] = function(a, b) #>=lua53
    return a + b
end

其实就是对一个特殊的table设置键值对。

跟着来一个导致很多人踩坑的冒号语法糖:

代码语言:javascript
复制
calc:add(1, 2) --语法糖

脱糖后是这样的

代码语言:javascript
复制
calc.add(calc, 1, 2)

和冒号语法糖相关的语法糖

代码语言:javascript
复制
function calc:add(a, b) --语法糖
end

一次脱糖后是这样

代码语言:javascript
复制
calc.add = function(self, a, b)
end

注意,你按脱糖后的写法,那个self你写啥名字都可以。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档