在go中使用lua示例, 基于gopher-lua!
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 

295 行
7.0 KiB

-- 通用lua扩充函数,与任何游戏逻辑无关
-- from http://snippets.luacode.org/?p=snippets/String_to_Hex_String_68
string.tohex = function(str, spacer)
return string.gsub(str,"(.)", function (c) return string.format("%02X%s", string.byte(c), spacer or "") end)
end
string.trim = function(str)
return string.gsub(str, "^%s*(.-)%s*$", "%1")
end
string.trimbegin = function(str)
return string.gsub(str, "^%s*(.-)$", "%1")
end
string.trimend = function(str)
return string.gsub(str, "^(.-)%s*$", "%1")
end
string.padleft = function(str, totalWidth, paddingChar)
local len = #str
if len >= totalWidth then
return str
else
paddingChar = paddingChar or ' '
assert(#paddingChar == 1)
return string.rep(paddingChar, totalWidth - len) .. str
end
end
string.padright = function(str, totalWidth, paddingChar)
local len = #str
if len >= totalWidth then
return str
else
paddingChar = paddingChar or ' '
assert(#paddingChar == 1)
return str .. string.rep(paddingChar, totalWidth - len)
end
end
string.split = function(szFullString, szSeparator)
local FindStartIndex = 1
local SplitArray = {}
while true do
local FindLastIndex = string.find(szFullString, szSeparator, FindStartIndex, true)
if not FindLastIndex then
table.insert(SplitArray, string.sub(szFullString, FindStartIndex, string.len(szFullString)))
break
end
table.insert(SplitArray, string.sub(szFullString, FindStartIndex, FindLastIndex-1))
FindStartIndex = FindLastIndex + string.len(szSeparator)
end
return SplitArray
end
string.isNilOrEmpty = function(str)
if str == nil then
return true, nil
end
if type(str) ~= "string" then
return true, nil
end
local fstr = string.match(str,"%s*(.-)%s*$")
local ret = fstr == ""
if ret == true then
str = nil
end
return ret, fstr
end
table.find = function(this, value)
for k,v in pairs(this) do
if v == value then return k end
end
end
table.omit = function(tbl)
for k,v in pairs(tbl) do
local typ = type(v)
if typ == "table" then
v = table.omit(v)
if v == nil or next(v) == nil then
tbl[k] = nil
end
elseif (typ == "string" and v == "") or (typ == "number" and v == 0) then
tbl[k] = nil
end
end
return tbl
end
table.tostring = function(data, _indent)
local visited = {}
local function dump(data, prefix)
local str = tostring(data)
if table.find(visited, data) ~= nil then return str end
table.insert(visited, data)
local prefix_next = prefix .. " "
str = str .. "\n" .. prefix .. "{"
for k,v in pairs(data) do
if type(k) == "number" then
str = str .. "\n" .. prefix_next .. "[" .. tostring(k) .. "] = "
else
str = str .. "\n" .. prefix_next .. tostring(k) .. " = "
end
if type(v) == "table" then
str = str .. dump(v, prefix_next)
elseif type(v) == "string" then
str = str .. '"' .. v .. '"'
else
str = str .. tostring(v)
end
end
str = str .. "\n" .. prefix .. "}"
return str
end
return dump(data, _indent or "")
end
table.merge = function(base, delta)
if type(delta) ~= "table" then return end
for k,v in pairs(delta) do
base[k] = v
end
end
table.extend = function(base, delta)
if type(delta) ~= "table" then return end
for i,v in ipairs(delta) do
table.insert(base, v)
end
end
table.len = function(tbl)
if type(tbl) ~= "table" then return 0 end
local n = 0
for k,v in pairs(tbl) do n = n + 1 end
return n
end
table.empty = function(tbl)
if tbl == nil then return true end
assert(type(tbl) == "table")
return next(tbl) == nil
--if #tbl > 0 then return false end
--for k,v in pairs(tbl) do return false end
--return true
end
-- http://snippets.luacode.org/?p=snippets/Deep_copy_of_a_Lua_Table_2
table.clone = function(t,deepnum)
if type(t) ~= 'table' then return t end
local mt = getmetatable(t)
local res = {}
if deepnum and deepnum > 0 then
deepnum = deepnum - 1
end
for k,v in pairs(t) do
if type(v) == 'table' then
if not deepnum or deepnum > 0 then
v = table.clone(v, deepnum)
end
end
res[k] = v
end
setmetatable(res,mt)
return res
end
-- http://snippets.luacode.org/?p=snippets/Table_Slice_116
table.slice = function(values,i1,i2)
local res = {}
local n = #values
i1 = i1 or 1
i2 = i2 or n
if i2 < 0 then
i2 = n + i2 + 1
elseif i2 > n then
i2 = n
end
if i1 < 1 or i1 > n then
return {}
end
local k = 1
for i = i1,i2 do
res[k] = values[i]
k = k + 1
end
return res
end
table.reverse = function(tab)
local size = #tab
local newTable = {}
for i,v in ipairs(tab) do
newTable[size+1-i] = v
end
return newTable
end
table.reset = function(t)
for k,v in pairs(t) do
t[k] = nil
end
return t
end
-- math.random({0.7, 0.1, 0.2}, {'A', 'B', 'C'})
math.random = function(m, n)
if type(m) == "table" and #m == #n then
-- 标准化概率表
local sum = 0
for _,v in ipairs(m) do sum = sum + v end
local sm = {}
for k,v in ipairs(m) do sm[k] = v / sum end
-- 得到下标
local r = go.rand.Random()
for k,v in ipairs(sm) do
if r <= v then return n[k]
else r = r - v end
end
assert(false)
end
if m == nil then return go.rand.Random() end
local _random = function(m, n)
m, n = math.min(m, n), math.max(m, n)
local mi, mf = math.modf(m)
local ni, nf = math.modf(n)
if mf == 0 and nf == 0 then
return go.rand.RandBetween(m, n)
else
return m + go.rand.Random() * (n - m)
end
end
if n == nil then return _random(1, m) end
return _random(m, n)
end
-- http://www.cplusplus.com/reference/algorithm/random_shuffle/
-- http://stackoverflow.com/questions/17119804/lua-array-shuffle-not-working
math.shuffle = function(array)
local counter = #array
while counter > 1 do
local index = math.random(counter)
array[index], array[counter] = array[counter], array[index]
counter = counter - 1
end
return array
end
--按table的key排序遍历table e.g. for k, v in pairsByKeys(tab, function(v1,v2) return v1 > v2 end) do print(k, v) end
function pairsByKeys(t, sortfunc)
local kt = {}
local len = 0
for k in pairs(t) do
len = len + 1
kt[len] = k
end
table.sort(kt, sortfunc)
local i = 0
return function()
i = i + 1
return kt[i], t[kt[i]]
end
end
--计算utf8字符串的长度 from quickcocos
function string.utf8len(input)
local len = string.len(input)
local left = len
local cnt = 0
local arr = {0, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc}
while left ~= 0 do
local tmp = string.byte(input, -left)
local i = #arr
while arr[i] do
if tmp >= arr[i] then
left = left - i
break
end
i = i - 1
end
cnt = cnt + 1
end
return cnt
end
--检查一个文件是否存在
function file_exists(path)
local file = io.open(path, "rb")
if file then file:close() end
return file ~= nil
end