日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

全局变量声明的规范化

發布時間:2025/5/22 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 全局变量声明的规范化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  Lua將環境本身存儲在一個全局變量_G中,(_G._G等于_G)。為了對全局命名空間更好的管理,最好是顯示的聲明每一個變量,可以通過使用metamethod來改變_G的行為來進行規范:

-- 聲明新的變量,使用rawset繞過metamethod的限制 -- 保證聲明的變量不為nil,如果聲明一個nil變量,等于該變量還是不存在,訪問該變量的時候還是會觸發__index declare = function(name, initval)rawset(_G, name, initval or false) end--改變全局變量的訪問行為 setmetatable(_G, {__newindex = function (_, n)error("attempt to write to undeclared variable " ..n, 2)end,__index = function(_, n)error("attempt to read undeclared variable "..n, 2)end,} )declare("a") a = 1 print(a) -- 1 a = nil print(a) -- error 觸發__index,因為該變量已經釋放了

  上述代碼中,每一個變量都需要顯示declare,并且不能聲明nil變量。

  下面這種方法可以聲明nil變量,但需要用一個表來顯示的記錄每一個聲明過的變量:

local declareNames = {} function declare(name, initval)rawset(_G, name, initval)declareNames[name] = true endsetmetatable(_G, {__newindex = function (t, n, v)if not declareNames[n] thenerror("attempt to write to undeclared var. " ..n, 2)elserawset(t, n, v)endend,__index = function (_, n)if not declareNames[n] thenerror("attempt to read undeclared var. "..n, 2)elsereturn nilendend} )declare("a") a = 1 print(a) -- 1 a = nil print(a) -- nil 還是可以訪問

  個人偏向于第一種方法,因為第二種方法中,當一個變量被置為nil以后,實際上該變量已經被釋放了,所以將變量的置空操作封裝在一個undeclear函數中。對第二種方法的改進:

local declareNames = {} function declare(name, initval)rawset(_G, name, initval)declareNames[name] = true endfunction undeclare(name)declareNames[name] = nilrawset(_G, name, nil) endsetmetatable(_G, {__newindex = function (t, n, v)if not declareNames[n] thenerror("attempt to write to undeclared var. " ..n, 2)elserawset(t, n, v)endend,__index = function (_, n)if not declareNames[n] thenerror("attempt to read undeclared var. "..n, 2)elsereturn nilendend} )declare("a") a = 1 print(a) -- 1 undeclare("a") print(a) -- error 變量已經不存在了,會觸發__index

  兩種方法的代價都很小,可以忽略不計,但是給整個編程環境帶來的好處是不言而喻的。

?

轉載于:https://www.cnblogs.com/sifenkesi/p/3838311.html

總結

以上是生活随笔為你收集整理的全局变量声明的规范化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。