美文网首页
Lua编码Tips及常用自定义函数

Lua编码Tips及常用自定义函数

作者: 尘尘飞 | 来源:发表于2020-02-14 21:21 被阅读0次

编码Tips

交换变量

遇到赋值语句Lua会先计算右边所有的值然后再执行赋值操作,所以我们可以这样进行交换变量的值:

x, y = y, x                     -- swap 'x' for 'y'
a[i], a[j] = a[j], a[i]         -- swap 'a[i]' for 'a[j]'

lua实现三目运算符

三元运算符a?b:c在lua里面可以写成a and b or c

问题:当b是false或者nil时无论a是什么最后结果都会返回c的值
解决:(a and {b} or {c})[1]

local a=5  
local b=2  
local m=nil  
-- local r=a>b and m or b    --当m为nil或false时,只会返回c的值  
local r=(a>b and {m} or {b})[1]  

print(r)  

pairs 和 ipairs区别

  • pairs: 迭代 table,可以遍历表中所有的 key 可以返回 nil
  • ipairs: 迭代数组,不能返回 nil,如果遇到 nil 则退出

取长度操作符’#’

它满足 t[n] 不是 nil 而 t[n+1] 为 nil; 此外,如果 t[1] 为 nil ,n 就可能是零。
在获取表的长度时,根据的是表的最大索引的值;
下标越过 1 位以上,长度还是为前面的。
如果数组有一个“空洞” (就是说,nil 值被夹在非空值之间), 那么 #t 可能是指向任何一个是 nil 值的前一个位置的下标 (就是说,任何一个nil 值都有可能被当成数组的结束)。

tab1 = {key1="1","2"}
print("tab1长度"..#tab2)      // tab1长度1

tab2 = {}
tab2[1]="1"
tab2[2]="2"
tab2[4]="4"
print("tab2长度"..#tab3)      // tab2长度4

tab3={}
tab3[1]="1"
tab3[2]="2"
tab3[5]="5"
print("tab3的长度",#tab3)      // tab3长度2

select变长参数

通常在遍历变长参数的时候只需要使用 {…},然而变长参数可能会包含一些 nil,那么就可以用 select 函数来访问变长参数了:select(‘#’, …) 或者 select(n, …)

  • select(‘#’, …) 返回可变参数的长度
  • select(n, …) 用于访问 n 到 select(‘#’,…) 的参数
do  
    function foo(...)  
        for i = 1, select('#', ...) do  -->获取参数总数
            local arg = select(i, ...); -->读取参数
            print("arg", arg);  
        end  
    end  

    foo(1, 2, 3, 4);  
end

常用自定义函数

去除字符串首尾的空格

function trim(s)
  return (string.gsub(s, "^%s*(.-)%s*$", "%1")) 
end
string1 = "   RUNOOB        "
string2 = trim(string1)
print(string2)

打印table

function print_r ( t )  
    local print_r_cache={}
    local function sub_print_r(t,indent)
        if (print_r_cache[tostring(t)]) then
            print(indent.."*"..tostring(t))
        else
            print_r_cache[tostring(t)]=true
            if (type(t)=="table") then
                for pos,val in pairs(t) do
                    if (type(val)=="table") then
                        print(indent.."["..pos.."] => "..tostring(t).." {")
                        sub_print_r(val,indent..string.rep(" ",string.len(pos)+8))
                        print(indent..string.rep(" ",string.len(pos)+6).."}")
                    elseif (type(val)=="string") then
                        print(indent.."["..pos..'] => "'..val..'"')
                    else
                        print(indent.."["..pos.."] => "..tostring(val))
                    end
                end
            else
                print(indent..tostring(t))
            end
        end
    end
    if (type(t)=="table") then
        print(tostring(t).." {")
        sub_print_r(t,"  ")
        print("}")
    else
        sub_print_r(t,"  ")
    end
    print()
end

table去重

table = {1 , 2 , 3 , 4 , 20 , 6 , 7 , 7 , 15 , 28};
function table_unique(t) 
    local check = {};
    local n = {};
    for key , value in pairs(t) do
        if not check[value] then
            n[key] = value
            check[value] = value
        end
    end
    return n
end 

for key , value in pairs(table_unique(table)) do
    print('value is ' , value)
end

table的长度

当我们获取 table 的长度的时候无论是使用 # 还是 table.getn 其都会在索引中断的地方停止计数,而导致无法正确取得 table 的长度。

可以使用以下方法来代替:

function table_leng(t)
  local leng=0
  for k, v in pairs(t) do
    leng=leng+1
  end
  return leng;
end

table最大值

table.maxn 在 Lua5.2 之后该方法已经不存在了,我们定义了 table_maxn 方法来实现。

function table_maxn(t)
  local mn=nil;
  for k, v in pairs(t) do
    if(mn==nil) then
      mn=v
    end
    if mn < v then
      mn = v
    end
  end
  return mn
end
tbl = {[1] = 2, [2] = 6, [3] = 34, [26] =5}
print("tbl 最大值:", table_maxn(tbl))
print("tbl 长度 ", #tbl)

将阿拉伯数字转换为语文汉字数字

local function NumToCN(num)
    local size = #tostring(num)
    local CN = ""
    local StrCN = {"一","二","三","四","五","六","七","八","九"}
    for i = 1 , size do
        CN = CN .. StrCN[tonumber(string.sub(tostring(num), i , i))]
    end
    return CN
end
print(NumToCN(56665))

相关文章

  • Lua编码Tips及常用自定义函数

    编码Tips 交换变量 遇到赋值语句Lua会先计算右边所有的值然后再执行赋值操作,所以我们可以这样进行交换变量的值...

  • Lua 快速笔记(二) syntax

    参考programing in lua 语法 函数 常用函数 语法 局部变量和代码块 控制语句 Lua 认为 fa...

  • R 使用笔记:日常备忘

    笔记内容:使用Rstudio的快捷键及tips一些工作中常用、有用的packages及函数各种日常备忘... .....

  • Lua 常用函数

    lua库函数 这些函数都是Lua编程语言的一部分, 点击这里了解更多. assert(value) - 检查一个值...

  • chrome浏览器使用

    设置编码 “自定义及控制”--“更多工具”--“编码”:选择unicode(utf-8),及自动检测 查看源代码及...

  • 【SQL.基础构建-第三节(3/4)】

    -- Tips:聚合和排序 -- 一、对表进行聚合查询 --1.聚合函数 --(1)5 个常用函数: --①CO...

  • Lua中的CAPI概述

    头文件lua.h: Lua提供的基础函数,包括创建Lua环境,调用Lua函数,读写Lua环境中的全局变量,以及注册...

  • JS函数charCodeAt的Lua实现

    JS函数charCodeAt的Lua实现 charCodeAt by Lua @(Lua JavaScript ...

  • Lua type和typeof区别

    type 是lua内置的函数,用来获取类型typeof 是一个自定义的函数,为了用来获取cs的类型 代码和输入如下:

  • Lua与C++如何相互交互?

    Lua与C++如何相互交互 通过lua虚拟栈隔离Lua和C/C++类型和彼此内存的差异来实现数据及函数互相调拥。1...

网友评论

      本文标题:Lua编码Tips及常用自定义函数

      本文链接:https://www.haomeiwen.com/subject/pntsfhtx.html