更好的lua代码

正则表达式优化Lua代码

2019-07-15  本文已影响0人  塘朗山小钻风

无GC结构体:

xlua已经对这些优化过

在Xlua中生成的PackUnpack.cs中可以看到这些结构体在Lua和C#中传递是用的是字节缓冲区。并不需要生成Object。所以无GC。

但是在Lua中却经常会写

local v = Vector3(1, 2, 3)

这个会调用中UnityEngineVector3Wrap.cs的Utils.BeginClassRegister(type, L, __CreateInstance, 25, 10, 0);中的__CreateInstance创建实例。

不用创建实例写法是local v = {x = 1, y = 2, z = 3}这样的。

VS Code中统一修改:在查找替换窗口这样输入

用正则表达式来优化结构体

在查找项捕获三个数据。捕获项([^(),]+)是为了避免Vector3(1, x(2, 3), 4)这样的数据项:中间某些是函数值。这样的情况在完成上面的替换后有针对性地来修改这样的特殊数据(项目中不会很多的)。

别的结构体依此类推。

过多的字符串拼接

查找模式如下

匹配三个字符串拼接。

(.*?)((?:".+?")|(?:[\]\[\w\d_.]+?)) *\.\. *((?:".+?")|(?:[\]\[\w\d_.]+?)) *\.\. *((?:".+")|(?:[\]\[\w\d_.]+))(?<!\.)(.*)

((?:".+?")|(?:[\]\[\w\d_.]+?))这个是匹配 "" 中的字符串或变量值。不怕麻烦的话也可以支持 '' 单引号中字符串:((?:["'].+?['"])|(?:[\]\[\w\d_.]+?))

local a = "xx"

local b = {x = "yy"}

str = "aa" .. a .. b.x .. "x"

替换模式如下:

local _concat_ = {$2, $3, $4}\n$1table.concat(_concat_ , '')$5

这样一行变两行

local _concat_ = {"aa",  a, b.x}

str = table.concat(_concat_ , '').. "x"

后发断言(?<!\.)就是为了不让$4匹配 .. "x" 中的两个点。

也可以依此类推8个字符串拼接的那种:

原来的字符串:

            str = str..rep("\t", level + 1).."["..rep("\"", k_is_str)..(tostring(k) or type(k))..rep("\"", k_is_str).."]".." = "

变成了:

local _concat_ = {str, rep("\t", level + 1), "[", rep("\"", k_is_str), (tostring(k) or type(k)), rep("\"", k_is_str), "]", " = "}

            str = table.concat(_concat_ , '')

避免table的rehash

待续

神奇的是这些都可以在vs code中完成。非常快的处理上千个文件

上一篇 下一篇

猜你喜欢

热点阅读