如何理解lua的語(yǔ)法糖
來(lái)源鏈接:https://zhuanlan.zhihu.com/p/285825344
這篇文章源于我看到某乎某用戶覺(jué)得lua語(yǔ)法“違反直覺(jué)”,我覺(jué)得有這感覺(jué)源于lua的語(yǔ)法糖,如果流于表面的把這些加糖后的語(yǔ)法往C,C#,java等語(yǔ)義上套確實(shí)容易產(chǎn)生誤解。另外xLua群上也經(jīng)常會(huì)問(wèn)些因?yàn)閷?duì)語(yǔ)法理解問(wèn)題導(dǎo)致問(wèn)題。
lua里頭一些很常見(jiàn)的語(yǔ)法,其實(shí)都是加了糖。比如這個(gè):
去糖后其實(shí)是這樣的,
去糖后更清晰了,a是table,table本質(zhì)上就是一個(gè)hashmap,我們往一個(gè)hashmap里頭設(shè)置了鍵值對(duì)。
再看這個(gè):
第一次去糖后是這樣:
再按照文章開(kāi)篇第一個(gè)語(yǔ)法糖再去一次糖,就變成了
所以,仍然是對(duì)一個(gè)hashmap設(shè)置鍵值對(duì),只不過(guò)值相對(duì)于c/c#/java比較特殊,這是個(gè)function(準(zhǔn)確來(lái)說(shuō)是一個(gè)closure),因?yàn)閘ua里頭函數(shù)是first-class的,可以作為一個(gè)普通值來(lái)處理。
再來(lái)
一次脫糖
二次脫糖就比較復(fù)雜,分兩種情況:前面有l(wèi)ocal變量add,前面沒(méi)有。
前面有l(wèi)ocal add,其實(shí)就是對(duì)add變量的一次賦值,如果沒(méi)有,還要脫糖:
其實(shí)就是對(duì)一個(gè)特殊的table設(shè)置鍵值對(duì)。
跟著來(lái)一個(gè)導(dǎo)致很多人踩坑的冒號(hào)語(yǔ)法糖:
脫糖后是這樣的
和冒號(hào)語(yǔ)法糖相關(guān)的語(yǔ)法糖
一次脫糖后是這樣
注意,你按脫糖后的寫(xiě)法,那個(gè)self你寫(xiě)啥名字都可以。