루아 팁

22689 단어

루아 팁

  • 자주 사용하는 도구 함수를 _에 추가G에서는 모든 파일을 직접 호출할 수 있습니다.
    --   a   _G:
    _G.IsEmptyStr = function(str) 
        return str==nil or type(str) ~= "string" or str == "" 
    end  
    _G.PrintObjPos = function(prefix, obj)
        prefix = prefix or ""
        local l,t,r,b = obj:GetObjPos()
        XLPrint(prefix .. " l=" .. l .. ", t=" .. t .. ", r=" .. r .. ", b=" .. b)
    end
    
    
    --  :
    if not IsEmptyStr(obj:GetText()) then  
        PrintObjPos("[Dongyu]", obj)
    end  

  • 사용or 작업자 기본값:
    num = num or 0

  • 조작부호를 사용하여 C 언어(a and b) or c의 기능을 구현합니다.
    num = (num < 0 and 0) or num
    
     :
    a and b  --   a   false,   a,   b
    a or b   --   a   true,   a,   b

  • UTF-8 문자열의 문자 수를 가져옵니다(중국어 혼합):
    local function strlength(str)
        --  , 
        str = string.gsub(str, "%%", " ") --  % " "
        local str = string.gsub(str, "[\128-\191]","")
        local _,ChCount = string.gsub(str, "[\192-\255]","")
        local _,EnCount = string.gsub(str, "[^\128-\255]","")
        return ChCount + EnCount
    end

    이 방법은 UTF-8 형식과 관련이 있으며 표준 ASC||코드(영어)는 0-127입니다.중국어는 3자(192-255)(128-191)(128-191)를 차지한다.상세한 상황은 이 문장을 참고할 수 있다
  • 문자열의 맨 끝 공백 제거:
    function trim (s) 
        return (string.gsub(s, "^%s*(.-)%s*$", "%1")) 
    end

  • string을 닫습니다.find(s,pattern,start,plain) 모드 일치:
    --   find   true,   pattern  , 
    pos = string.find(str, "%s", 1, true)

  • 분할 문자열:
    function split(s, delim)
        if type(delim) ~= "string" or string.len(delim) <= 0 then
            return
        end
    
        local start = 1
        local t = {}
        while true do
        local pos = string.find (s, delim, start, true) -- plain find
            if not pos then
              break
            end
    
            table.insert (t, string.sub (s, start, pos - 1))
            start = pos + string.len (delim)
        end
        table.insert (t, string.sub (s, start))
    
        return t
    end

  • table.concat 인쇄 배열:
    local t = {"2016", "3", "6"}
    print(table.concat(t, "-"))    -- 2016-3-6

  • 인쇄table:
    function print_lua_table (lua_table, indent)
        local function print_func(str)
            XLPrint("[Dongyu] " .. tostring(str))
        end
    
        if lua_table == nil or type(lua_table) ~= "table" then
            print_func(tostring(lua_table))
            return
        end
    
        indent = indent or 0
        for k, v in pairs(lua_table) do
            if type(k) == "string" then
                k = string.format("%q", k)
            end
            local szSuffix = ""
            if type(v) == "table" then
                szSuffix = "{"
            end
            local szPrefix = string.rep(" ", indent)
            formatting = szPrefix.."["..k.."]".." = "..szSuffix
            if type(v) == "table" then
                print_func(formatting)
                print_lua_table(v, indent + 1)
                print_func(szPrefix.."},")
            else
                local szValue = ""
                if type(v) == "string" then
                    szValue = string.format("%q", v)
                else
                    szValue = tostring(v)
                end
                print_func(formatting..szValue..",")
            end
        end
    end

  • 복제 테이블:
    function copy_table(ori_tab)
        if type(ori_tab) ~= "table" then
            return
        end
        local new_tab = {}
        for k,v in pairs(ori_tab) do
            local vtype = type(v)
            if vtype == "table" then
                new_tab[k] = copy_table(v)
            else
                new_tab[k] = v
            end
        end
        return new_tab
    end

    또는
    function deepcopy(object)
        local lookup_table = {}
        local function _copy(object)
            if type(object) ~= "table" then
                return object
            elseif lookup_table[object] then
                return lookup_table[object]
            end
    
            local new_table = {}
            lookup_table[object] = new_table
            for index, value in pairs(object) do
                new_table[_copy(index)] = _copy(value)
            end
            return setmetatable(new_table, getmetatable(object))
        end
        return _copy(object)
    end

  • for 순환 중 remove 그룹 요소:
    local t = {1,2,3,3,5,3,6}
    for i,v in ipairs(t) do
        if v == 3 then
            table.remove(t,i)
        end
    end
    --  ,  3  ,ipairs  ,
    -- remove   3  ,ipairs   5   3
    
    local t = {1,2,3,3,5,3,6}
    for i=1, #t do
        if t[i] == 3 then
            table.remove(t,i)
            i = i-1
        end
    end
    --  ,i=i-1  ,i   1   #t,for   i  
    
    local t = {1,2,3,3,5,3,6}
    for i=#t, 1, -1 do
        if t[i] == 3 then
            table.remove(t,i)
        end
    end
    --  , 
    
    local t = {1,2,3,3,5,3,6}
    local i = 1
    while t[i] do
        if t[i] == 3 then
            table.remove(t,i)
        else
            i = i+1
        end
    end
    --  ,  i  

  • table.sort(t,comp) 정렬 수조:sort는table 수조 부분의 요소를 정렬할 수 있으며,comp(a,b) 함수를 제공해야 합니다. 만약에 a가 b 앞에 배열되어야 한다면,comp는true를 되돌려야 합니다.주의: a==b의 경우false:
    local function comp(a,b) 
        return a <= b 
    end 
    table.sort(t,comp) 
    --  , :attempt to compare number with nil 
    
    local function comp(a,b) 
        if a == nil or b == nil then 
            return false 
        end 
        return a <= b 
    end 
    table.sort(t,comp) 
    --  , :invalid order function for sorting 
    --  , ;

    a==b가true로 되돌아오는 것은 이런 문제를 일으킬 수 있다.table 때문이다.sort는 빠른 정렬을 위해 경계 검사를 하지 않았습니다.
    for (;;) {
        while (lua_rawgeti(L, 1, ++i), sort_comp(L, -1, -2))  //  , i  
        {
            if (i>=u) luaL_error(L, "invalid order function for sorting");
            lua_pop(L, 1);
        }
        while (lua_rawgeti(L, 1, --j), sort_comp(L, -3, -1))  //  , j  
        {
            if (j<=l) luaL_error(L, "invalid order function for sorting");
            lua_pop(L, 1);
        }
        if (j<i) {
            lua_pop(L, 3);
            break;
        }
        set2(L, i, j);
    }

    위 코드를 보십시오. 만약에 a==b시true로 되돌아오고 경계의 몇 개의 값이 같다면sort_comp는 경계를 넘어서 이상attempt tocomparenumber withnil을 일으킬 때까지 i의 성장을 막을 수 없습니다.a와 b에 대해 비공식 판단을 하더라도 i가 경계를 초과하여 이상인validorderfunctionforsorting을 일으킬 수 있습니다.
  • 좋은 웹페이지 즐겨찾기