在go中使用lua示例, 基于gopher-lua!
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

295 line
7.0 KiB

4 年之前
  1. -- 通用lua扩充函数,与任何游戏逻辑无关
  2. -- from http://snippets.luacode.org/?p=snippets/String_to_Hex_String_68
  3. string.tohex = function(str, spacer)
  4. return string.gsub(str,"(.)", function (c) return string.format("%02X%s", string.byte(c), spacer or "") end)
  5. end
  6. string.trim = function(str)
  7. return string.gsub(str, "^%s*(.-)%s*$", "%1")
  8. end
  9. string.trimbegin = function(str)
  10. return string.gsub(str, "^%s*(.-)$", "%1")
  11. end
  12. string.trimend = function(str)
  13. return string.gsub(str, "^(.-)%s*$", "%1")
  14. end
  15. string.padleft = function(str, totalWidth, paddingChar)
  16. local len = #str
  17. if len >= totalWidth then
  18. return str
  19. else
  20. paddingChar = paddingChar or ' '
  21. assert(#paddingChar == 1)
  22. return string.rep(paddingChar, totalWidth - len) .. str
  23. end
  24. end
  25. string.padright = function(str, totalWidth, paddingChar)
  26. local len = #str
  27. if len >= totalWidth then
  28. return str
  29. else
  30. paddingChar = paddingChar or ' '
  31. assert(#paddingChar == 1)
  32. return str .. string.rep(paddingChar, totalWidth - len)
  33. end
  34. end
  35. string.split = function(szFullString, szSeparator)
  36. local FindStartIndex = 1
  37. local SplitArray = {}
  38. while true do
  39. local FindLastIndex = string.find(szFullString, szSeparator, FindStartIndex, true)
  40. if not FindLastIndex then
  41. table.insert(SplitArray, string.sub(szFullString, FindStartIndex, string.len(szFullString)))
  42. break
  43. end
  44. table.insert(SplitArray, string.sub(szFullString, FindStartIndex, FindLastIndex-1))
  45. FindStartIndex = FindLastIndex + string.len(szSeparator)
  46. end
  47. return SplitArray
  48. end
  49. string.isNilOrEmpty = function(str)
  50. if str == nil then
  51. return true, nil
  52. end
  53. if type(str) ~= "string" then
  54. return true, nil
  55. end
  56. local fstr = string.match(str,"%s*(.-)%s*$")
  57. local ret = fstr == ""
  58. if ret == true then
  59. str = nil
  60. end
  61. return ret, fstr
  62. end
  63. table.find = function(this, value)
  64. for k,v in pairs(this) do
  65. if v == value then return k end
  66. end
  67. end
  68. table.omit = function(tbl)
  69. for k,v in pairs(tbl) do
  70. local typ = type(v)
  71. if typ == "table" then
  72. v = table.omit(v)
  73. if v == nil or next(v) == nil then
  74. tbl[k] = nil
  75. end
  76. elseif (typ == "string" and v == "") or (typ == "number" and v == 0) then
  77. tbl[k] = nil
  78. end
  79. end
  80. return tbl
  81. end
  82. table.tostring = function(data, _indent)
  83. local visited = {}
  84. local function dump(data, prefix)
  85. local str = tostring(data)
  86. if table.find(visited, data) ~= nil then return str end
  87. table.insert(visited, data)
  88. local prefix_next = prefix .. " "
  89. str = str .. "\n" .. prefix .. "{"
  90. for k,v in pairs(data) do
  91. if type(k) == "number" then
  92. str = str .. "\n" .. prefix_next .. "[" .. tostring(k) .. "] = "
  93. else
  94. str = str .. "\n" .. prefix_next .. tostring(k) .. " = "
  95. end
  96. if type(v) == "table" then
  97. str = str .. dump(v, prefix_next)
  98. elseif type(v) == "string" then
  99. str = str .. '"' .. v .. '"'
  100. else
  101. str = str .. tostring(v)
  102. end
  103. end
  104. str = str .. "\n" .. prefix .. "}"
  105. return str
  106. end
  107. return dump(data, _indent or "")
  108. end
  109. table.merge = function(base, delta)
  110. if type(delta) ~= "table" then return end
  111. for k,v in pairs(delta) do
  112. base[k] = v
  113. end
  114. end
  115. table.extend = function(base, delta)
  116. if type(delta) ~= "table" then return end
  117. for i,v in ipairs(delta) do
  118. table.insert(base, v)
  119. end
  120. end
  121. table.len = function(tbl)
  122. if type(tbl) ~= "table" then return 0 end
  123. local n = 0
  124. for k,v in pairs(tbl) do n = n + 1 end
  125. return n
  126. end
  127. table.empty = function(tbl)
  128. if tbl == nil then return true end
  129. assert(type(tbl) == "table")
  130. return next(tbl) == nil
  131. --if #tbl > 0 then return false end
  132. --for k,v in pairs(tbl) do return false end
  133. --return true
  134. end
  135. -- http://snippets.luacode.org/?p=snippets/Deep_copy_of_a_Lua_Table_2
  136. table.clone = function(t,deepnum)
  137. if type(t) ~= 'table' then return t end
  138. local mt = getmetatable(t)
  139. local res = {}
  140. if deepnum and deepnum > 0 then
  141. deepnum = deepnum - 1
  142. end
  143. for k,v in pairs(t) do
  144. if type(v) == 'table' then
  145. if not deepnum or deepnum > 0 then
  146. v = table.clone(v, deepnum)
  147. end
  148. end
  149. res[k] = v
  150. end
  151. setmetatable(res,mt)
  152. return res
  153. end
  154. -- http://snippets.luacode.org/?p=snippets/Table_Slice_116
  155. table.slice = function(values,i1,i2)
  156. local res = {}
  157. local n = #values
  158. i1 = i1 or 1
  159. i2 = i2 or n
  160. if i2 < 0 then
  161. i2 = n + i2 + 1
  162. elseif i2 > n then
  163. i2 = n
  164. end
  165. if i1 < 1 or i1 > n then
  166. return {}
  167. end
  168. local k = 1
  169. for i = i1,i2 do
  170. res[k] = values[i]
  171. k = k + 1
  172. end
  173. return res
  174. end
  175. table.reverse = function(tab)
  176. local size = #tab
  177. local newTable = {}
  178. for i,v in ipairs(tab) do
  179. newTable[size+1-i] = v
  180. end
  181. return newTable
  182. end
  183. table.reset = function(t)
  184. for k,v in pairs(t) do
  185. t[k] = nil
  186. end
  187. return t
  188. end
  189. -- math.random({0.7, 0.1, 0.2}, {'A', 'B', 'C'})
  190. math.random = function(m, n)
  191. if type(m) == "table" and #m == #n then
  192. -- 标准化概率表
  193. local sum = 0
  194. for _,v in ipairs(m) do sum = sum + v end
  195. local sm = {}
  196. for k,v in ipairs(m) do sm[k] = v / sum end
  197. -- 得到下标
  198. local r = go.rand.Random()
  199. for k,v in ipairs(sm) do
  200. if r <= v then return n[k]
  201. else r = r - v end
  202. end
  203. assert(false)
  204. end
  205. if m == nil then return go.rand.Random() end
  206. local _random = function(m, n)
  207. m, n = math.min(m, n), math.max(m, n)
  208. local mi, mf = math.modf(m)
  209. local ni, nf = math.modf(n)
  210. if mf == 0 and nf == 0 then
  211. return go.rand.RandBetween(m, n)
  212. else
  213. return m + go.rand.Random() * (n - m)
  214. end
  215. end
  216. if n == nil then return _random(1, m) end
  217. return _random(m, n)
  218. end
  219. -- http://www.cplusplus.com/reference/algorithm/random_shuffle/
  220. -- http://stackoverflow.com/questions/17119804/lua-array-shuffle-not-working
  221. math.shuffle = function(array)
  222. local counter = #array
  223. while counter > 1 do
  224. local index = math.random(counter)
  225. array[index], array[counter] = array[counter], array[index]
  226. counter = counter - 1
  227. end
  228. return array
  229. end
  230. --按table的key排序遍历table e.g. for k, v in pairsByKeys(tab, function(v1,v2) return v1 > v2 end) do print(k, v) end
  231. function pairsByKeys(t, sortfunc)
  232. local kt = {}
  233. local len = 0
  234. for k in pairs(t) do
  235. len = len + 1
  236. kt[len] = k
  237. end
  238. table.sort(kt, sortfunc)
  239. local i = 0
  240. return function()
  241. i = i + 1
  242. return kt[i], t[kt[i]]
  243. end
  244. end
  245. --计算utf8字符串的长度 from quickcocos
  246. function string.utf8len(input)
  247. local len = string.len(input)
  248. local left = len
  249. local cnt = 0
  250. local arr = {0, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc}
  251. while left ~= 0 do
  252. local tmp = string.byte(input, -left)
  253. local i = #arr
  254. while arr[i] do
  255. if tmp >= arr[i] then
  256. left = left - i
  257. break
  258. end
  259. i = i - 1
  260. end
  261. cnt = cnt + 1
  262. end
  263. return cnt
  264. end
  265. --检查一个文件是否存在
  266. function file_exists(path)
  267. local file = io.open(path, "rb")
  268. if file then file:close() end
  269. return file ~= nil
  270. end