Lua蚀語ずCorona SDK2/3パヌト

画像

これは、 Corona SDKの Lua蚀語の基本抂念に関する蚘事の3぀のパヌトの2番目です 最初のパヌトを読んでいない堎合は、 最初に読むこずをお勧めしたす。このパヌトでは、蚀語のすべおのデヌタ型を怜蚎したす。 すべおのタむプの倉数を初期化し、それらの倀を䜿甚しお、あるタむプを別のタむプに倉換する方法を孊習したす。 この蚘事は蚀語孊習の点で非垞に重芁であり、ゲヌムを曞く際に倚くの間違いを避けるこずができる貎重なヒントを倚数远加しようずしたした。

デヌタ型ずその倉換


Luaには8぀のデヌタ型がありたす。 型を怜蚎する前に、lua蚀語の暙準機胜である型に泚目したす。 この関数は、指定された倉数たたはデヌタのデヌタ型の名前を含む文字列を返したす。 型関数の䜿甚䟋

n = nil st = '' pi = 3.14 func = function()end t = {} b = true co = coroutine.create(function ()end) print(type(n), type(st), type(pi), type(func), type(t), type(b), type(co)) --: nil string number function table boolean thread 

次に、この蚀語Luaのタむプを怜蚎したす。

タむプnil


デフォルトでは、このデヌタ型には倀が割り圓おられおいない倉数がありたす。 タむプnilのすべおの倉数の倀はnilです。 このタむプは、次の2぀の方法で倉数に割り圓おるこずができたす。

 local B = nil--   local A--    -- -        nil 

倉数が珟圚のスコヌプで初期化されおいない堎合、その型ず倀はnilになるこずに泚意しおください。 タむプnilの倉数は、論理挔算ではなく倀falseを持぀論理倉数の比范の順序で比范できたすが、実際にはこれらのタむプは類䌌しおいないため、䟋を瀺したす。

 n = nil b = false if not n then--true print(1) end if not b then--true print(2) end if b == n then--false print(3) end -->> 1 -->> 2 

ブヌル型


ブヌル型は、比范挔算を実装するため、論理型たたはブヌル型ずも呌ばれたす。 前述のように、ブヌルにはfalseずtrue falseずtrue の2぀の倀のみがありたす 。 すべおの比范挔算はこれらの倀を正確に返すため、このタむプの倉数は比范挔算の倀を割り圓おるこずで初期化できたすが、倀を盎接割り圓おるこずで初期化するこずもできたす。 ブヌル型の倉数は、等号および䞍等号の操䜜、およびif / elseifの比范条件ずのみ盎接比范できたす。

 --    b1 = false b2 = true --   b3 = b1 ~= b2--true b4 = b1 == b2--false if b1 == b3 then--true print(true) end if b3 then print(true) end 

型番


拡匵された数倀タむプの完党な説明は、このテキストの範囲を倧きく超えおいるため、奜奇心itive盛なナヌザヌはリンクをたどり、仕様を詳现に理解できたす。 私は、敎数ず浮動小数点の䞡方の負数ず正数の䞡方がこのタむプに察応できるず蚀うこずができたす。特定のレベルの正ず負のビットでは、指数圢匏の数倀ぞの自動遷移がありたすが、ビット制限はデバむスのプロセッサのビット容量に䟝存したすが、珟時点ではCorona SDKはAndroid 4.0.3以降をサポヌトしおいたす 。これは、ほずんどの堎合、利甚可胜なすべおのデバむスが64ビットになるこずを意味したす。 数倀型の倉数を初期化するには、䜿甚可胜な圢匏のいずれかで倀を明瀺的に割り圓おるか、蚈算結果に倉数を割り圓おるか、この型の別の倉数ず同等にするだけで十分です。 論理比范の操䜜で型番号の倉数はすべお0および-1でもtrueを返すこずに泚意しおください。これは、c ++蚀語 など のファンが考慮する必芁がありたす0はfalseに類䌌しおいたす。 タむプ番号を䜿甚した操䜜の䟋を瀺したす。

 local a,b = 2,3--  local c = a + b--   --   d = 12e5 -- 1 200 000 e = 2e-3 -- 0.002 --   f = 0x234 -- 564 --  j = 1.23 k = .55 -- 0.55 -    1       

タむプ番号の倉数を䜿甚するず、倚くの数倀挔算を実行できたす。その䞻な䟋を以䞋に瀺したす。

 a = b + c --  a = b - c -- a = b * c --  a = b / c --  a = b % c --    a = b ^ c -- b   c 

タむプ文字列


String型はLuaで非垞によく開発されおおり、この型の倉数を備えた倚くの機胜を備えおいたす。 文字列型の倉数を䜜成する方法

 local st1 = 'qwert'--  st2 = st1--   st3 = st1 .. st2--    

䟋から気づいたように、文字列の連結は 2぀のポむントによっお実行されたす。さらに、連結プロセス自䜓は、数倀を文字列に倉換する方法の1぀ずしお䜿甚できたす。䟋を挙げたす。

 i = 10--number st = '11'--string konc1 = 1 .. st --  konc2 = 100..''--       string print(konc1, konc2, type(konc1) , type(konc2 )-->>111 100 string string 

ご芧のずおり、数倀から文字列ぞの倉換は非垞に簡単です。 ラむンカップリングを䜿甚する堎合、クラッチ挔算子ずオペランドの間にスペヌスを入れるのが最善であるこずに泚意しおください。これは必ずしも必芁ではありたせんが、最初はずおも矎しく明確であり、次にオペランドの1぀であるため、 -数字数字ず等しい倉数、぀たり数字で はありたせん 、スペヌスを入れないず、「 䞍正な圢匏の数字が近くにありたす」ずいう゚ラヌが発生したす。 倉換するための埓来のアプロヌチがありたすが、䞡方向の翻蚳の䟋を瀺したす。

 i1 = 1 s1 = '11' i2 = tonumber(s1)-- string -> number s2 = tostring(i1)--  number -> string 

たた、文字列から数倀ぞの暗黙的な倉換も存圚するこずを付け加えたすが、これを行わないこずを匷くお勧めしたす-それは完党にいものであり、い぀の日か耇雑な゚ラヌに぀ながるでしょう

 --      st = '10' i = 10 + st print(i, type(i))-->> 20 number 

文字列型の倉数を初期化するず、耇雑なモヌメントが発生するこずがよくありたす。これに぀いお簡単に説明し、それらを解決する方法を瀺したす。


䞊で曞いたように、stringには倚くの䟿利なアメニティが含たれおいたす。それらは以䞋で説明する関数を䜿甚しお実装されたす。

string.lens/ slen


この関数を䜿甚するず、文字列の長さを決定できたす。 これは、 文字列ラむブラリの他のほずんどの関数ず同様に、2぀の方法で䜿甚できたすが、以䞋の機胜の䟋がありたす。䜿甚䟋を以䞋に瀺したす。

 --  string.len(s) local st = 'Hello World!' local len_st = string.len(st) print(len_st)-->>12 --  s:len() local le_st = st:len() print(len_st)-->>12 --    print(string.len('Examlpe string'))-->>14 --   -    --      print('Examlpe string':len())-->> Error: ')' expected near ':' 

おそらくお気づきのように、関数を䜿甚する方法は間違っおいたす。コメントぱラヌの本質を説明しおいたす。 関数を䜿甚するためのルヌルは、ラむブラリの他のすべおの関数に共通であるため、今埌はこれに぀いお詳しく説明したせん。

string.bytes [、i [、j]]/ sバむト[i [、j]]


この関数は、i番目からj番目たでの文字列の文字コヌドを返したす。 パラメヌタiずjはオプションです。jを指定しない堎合、i番目の芁玠のコヌドのみが返されたす。iを指定せずにjを指定するず、最初からj番目の文字コヌドが返されたす。文字列の最初の文字のコヌド。 関数の䜿甚䟋を瀺したす。

 local s = 'Example' print(s:byte())--  >> 69 print(string.byte(s, 3))--  >> 97 print(string.byte(s,nil, 4))--   4- >> 69 120 97 109 print(s:byte(nil, s:len()))--  >> 69 120 97 109 112 108 101 

string.chari1、i2、...


この関数には、文字番号を持぀1぀以䞊のパラメヌタヌが枡され、送信されたすべおの文字に等しい文字列が返されたす。 この関数は、string.char関数に関しお反察の目的を持っおいたす。 䜿甚䟋

 print(string.char(65)) -->> A print(string.char(72,101,108,108,111)) -->> Hello local s = 'Example' print(string.char(s:byte(1,s:len())))-- s:byte   --- st        >> Example 

string.finds、パタヌン[、むンデックス[、no_regular]]
s怜玢パタヌン[、むンデックス[、no_regular]]


怜玢機胜を䜿甚するず、文字列sでパタヌンpatternの䜍眮を怜玢できたす。芋぀からない堎合はnilを怜玢できたす。 パタヌンは、文字列たたは正芏衚珟のいずれかです  別の章で正芏衚珟の詳现を孊習したす 。 findの最も簡単なナヌスケヌスを怜蚎し、次にオプションのパラメヌタヌの機胜に移りたしょう。

 local s = "Hello Lua!" print(string.find(s,"Lua"))--      --  Lua   s >> 7 9 print(s:find("%sL"))--    " -- L       " >> 6 7 

むンデックスパラメヌタはデフォルトで1です。これは、最初から怜玢する堎合、最初に芋぀かった゚ントリの䜍眮が返されるこずを意味したす。むンデックスを䟋3に蚭定するず、文字列の3番目の出珟が先頭から返されたす。行末。 no_regularパラメヌタヌは論理的です。 true / falsetrue / falseを指定できたす。デフォルトではパラメヌタヌはfalseです。trueに蚭定するず、パタヌンパラメヌタヌは、正芏衚珟を入力した堎合でも垞に正芏の文字列ずしお認識されたす。 findの拡匵䜿甚の䟋を次に瀺したす。

 s = 'La La La La %sLa La' print(s:find('La', 2)) --    >> 4 5 print(s:find('La', -2)) --    >> 18 19 print(s:find('%sLa', 1, true)) -->>  ,    >> 13 16 

string.formats、e1、e2、...
s圢匏e1、e2、...


string.format関数は、䞀連の匕数を持぀フォヌマットされた文字列を䜜成したす。 䞀芋するず、この関数は理解しにくいように思えるかもしれたせんが、実際には、最終情報を衚瀺するずきに倚くの構造を倧幅に簡玠化できたす。たた、たずえば、数倀から16進コヌドのストリングぞのその他の間接的な倉換にも非垞に䟿利です。 最も簡単な䟋を挙げたす。

 local sum1,sum2 = 100,200--   print(string.format('Value1: %d, Value2: %d', sum1,sum2))-->> Value1: 100, Value2: 200 

ご芧のずおり、最初に行圢匏がありたす。この圢匏には、このパラメヌタヌに続くパラメヌタヌの䜿甚方法を瀺す匕数が含たれおいたす。 数倀を管理するための匕数は11 c、d、E、e、f、g、i、o、u、X、x  、文字列を管理するための匕数は2 s、q です。 次に、各匕数に぀いお簡単に説明し、その埌で䜿甚䟋を瀺したす。


 print(string.format('Number: %d, Signed: %i, Unsigned: %u', 100,-100,-200)) -->> Number: 100, Signed: -100, Unsigned: 4294967096 print(string.format("%c%c%c%c%c%c%c", 69,120,97,109,112,108,101)) -->> Example print(string.format("%e, %E", math.pi,math.pi))-->> 3.141593e+000, 3.141593E+000 print(string.format("%f, %g", math.pi,math.pi))-->> 3.141593, 3.14159 print(string.format("%o, %x, %X", 1024,4069,16382)) -->> 2000, fe5, 3FFE print(string.format("%s %q", "Hello", "Corona SDK!"))-->> Hello "Corona SDK!" 

string.lowers/ slower


この関数は、文字列のすべおの文字を小文字に倉換したす。

 print(string.lower('Hello World!')) -->> hello world! 

string.uppers/ s䞊郚


この関数は、文字列のすべおの文字を倧文字に倉換したす。

 print(string.upper('Hello World!')) -->>HELLO WORLD! 

string.reps、n/ srepn


関数には文字列ず数倀nが枡され、文字列はn回繰り返されたす。

 local s = 'Corona ' print(s:rep(3))-->> Corona Corona Corona 

string.reverses/ sreverse


この関数は、文字の逆順で枡された文字列を返したす。

 print(string.reverse('9876543210')) -->0123456789 

string.matchs、パタヌン[、むンデックス]
s䞀臎パタヌン[、むンデックス]


string.match関数は、正芏衚珟パタヌンに埓っおstring内の゚ントリを怜玢し、キャプチャパラメヌタヌを返したす。 正芏衚珟のキャプチャに぀いおは、察応するセクションで詳しく説明したす。 この関数にはオプションのパラメヌタヌむンデックスがあり、これはデフォルトで1に等しく、どのアカりントからパタヌンをキャプチャするかを決定したす; string.findず同様に、負のむンデックス倀はサポヌトされおいないこずに泚意しおください

 local reg = " (%w+):(%d+)"--    2  local s = " force:30, speed:25"--     local key, value = s:match(reg, 2)--    print(key, value)-->> speed 25 

string.gmatchs、パタヌン
sgmatchパタヌン


string.gmacth関数は、倚くの点でstring.macth関数に䌌おいたすが、ルヌプの匕数ずしお䜿甚するこずを目的ずしおいたすルヌプの詳现に぀いおは、察応するセクションで説明したす。 string.gmacthは、文字列内のすべおの出珟からのキャプチャを呚期的に返したす。 むンデックスは必須ではありたせん。次の䟋のようになりたす。

 local reg = " (%w+):(%d+)"--    2  local s = " force:30, speed:25"--     for key, value in s:gmatch(reg) do--     print(key, value) end -->> force 30 -->> speed 25 

ルヌプバックはLuaの最も匷力なツヌルです。ルヌプバックを䜿甚できるこずにより、耇雑な文字列倀を解析するための倚くのルヌチン操䜜が倧幅に容易になりたす。

string.subs、i [、j]
ssubi [、j]


string.sub関数は、枡された文字列の郚分文字列を返したす。 郚分文字列は、i番目の文字で始たりたす。 3番目の匕数jが指定されおいない堎合、サブストリングは行末で終了したす。 3番目の匕数が指定されおいる堎合、サブストリングはj番目の文字で終了したす。 iたたはjの倀が負の堎合、カりントは行の最埌から始たりたす。 䜿甚䟋を瀺したす。

 local s = 'To be or not to be' print(s:sub(7))-->>or not to be print(s:sub(7,12))-->>or not print(s:sub(-5))-->>to be print(s:sub(4,-3))-->>be or not to print(s:sub(-8,-4))-->>ot to 

string.gsubs、パタヌン、眮換[、n]
sgsubパタヌン、[、n]を眮換


string.gsub関数は、最も匷力な蚀語関数の1぀です。 この関数には、最も単玔な堎合にいく぀かのアプリケヌションがありたす。文字列sのパタヌンで指定されたすべおの䞀臎を、すべおの堎所でreplaceで指定された倀に眮き換えたす.nを䜿甚しお、眮換の数を制限でき、関数は結果の文字列ず眮換の数を返したす

 local s = 'dust ist fantastisch' print(s:gsub('s','S'))-->>duSt iSt fantaStiSch 4 local s = 'lalalalala' print(s:gsub('a','A',3))-->>lAlAlAlala 3 

string.findず同様に、正芏衚珟キャプチャを怜玢パタヌンずしお䜿甚できたす。 キャプチャ匕数は、indexindex_numberに埓っお配眮できたす。

 print(string.gsub("lalalalala", "(l)(a)", "%2%1")) --  l  a --      -->> alalalalal 5 

関数は眮換パラメヌタヌずしお䜿甚できたすが、正芏衚珟によっおキャプチャヌされたパラメヌタヌはパラメヌタヌずしお枡されたす。

 string.gsub("12 23 34", "(%d+)", print)--     -->> 12 -->> 23 -->> 34 


utf-8に぀いお䞀蚀。


このため、文字列ラむブラリのほずんどの関数はutf-8圢匏で正しく動䜜できたせん。これは、囜別゚ンコヌドやその他の特殊文字を含む文字列が正しく凊理されないためです。 これらの問題を解決するために、Corona SDKには個別のutfラむブラリがありたす。これには、文字列ラむブラリの機胜の類䌌物ずそのいく぀かの機胜がありたす。 詳现に぀いおは、このラむブラリはCorona SDKの孊習のコンテキストで怜蚎されたすが、読者は独自に孊習するこずもできたす。

タむプ衚


テヌブルタむプは、Luaのデヌタ衚珟の最も基本的なタむプであり、最も䞀般的な意味では、蚀語のほずんどすべおの䞻芁な゚ンティティはテヌブルであり、゜ヌスファむルです。 テヌブルの䜜成方法ずそれらの操䜜方法

 local t = {}--   t['key1'] = 'name1'--  key1   "name1" t['key2'] = {}--  key2   t['key2']['key3'] = 123--  key3   key2 

たったく同じテヌブルを別の方法で初期化できたす。

 local t = { key1 = 'name1', key2 = { key3 = 123, }, } 

これらの゚ントリは同䞀であるこずに泚意しおください。

 t['key1'] = 'name1' t.key1 = 'name1' 

最初のタむプのレコヌドの意味は、数倀がキヌずしお䜿甚される堎合にのみ存圚したす。

 t[1] = 111--  t.1 = 111--    

衚に蚘録されおいる倀は、読み取りおよび曞き蟌みに䜿甚できたす。

 print(t.key1)-->> name1 t.key1 = 'name2' print(t.key1)-->> name2 

テヌブルの内容党䜓をクリアするには、次のいずれかの方法を䜿甚できたす。

 t = {}--   -     table.remove(t)--     

テヌブルキヌの1぀を削陀する堎合は、次の2぀の方法がありたす。

 t.key1 = nil-- nil   table.remove(t, key1)--     

Luaでテヌブルを初期化する最も自然な方法は、番号付き配列を䜜成するこずです。これは次の方法で行われたす。

 local t = {23, 45, 3.14, 'vasia', {12, 'a'}} 

実際、テヌブルの初期化䞭にキヌを指定しない堎合、番号付けは1から始たる昇順で行われたすほずんどの開発者にずっお、0からの番号付けはより自然ですが、Luaではそうではないので、これを芚えおおく必芁がありたす。 初期化されたテヌブルは、実際には次のようになりたす。

 local t = { [1] = 23, [2] = 45, [3] = 3.14, [4] = 'vasia', [5] = { [1] = 12, [2] = 'a', }, } 

ご芧のずおり、デヌタの「裏偎」では、非垞に重芁な倉換が行われおいたす。 Luaの番号付きテヌブルには特別なプロパティがありたす。たずえば、テヌブル名に蚘号を远加するず、テヌブル内の厳密に番号付けされた倀の数が取埗されたす。

 print(#t)-->>5 print(#t[5])-->>2 (     5) 

から取埗した厳密に番号付けされた新しいキヌをテヌブルに远加するず、テヌブルのサむズが増加したす。

 t[#t+1] = 'kolia' print(#t)-->> 6 

たずえば、nilを割り圓おおキヌの1぀を削陀するず、キヌ[3]番号付き配列の連続郚分は2぀のキヌ[1]ず[2]に削枛され、誀解によるさらなる゚ラヌに぀ながるこずはありたせん。 table.removeを䜿甚しおテヌブルからキヌを削陀したす。キヌを削陀するず、残りの厳密に番号付けされた倀がシフトされるためです。

 --   t[3] = nil print(#t)-->> 2 --   table.remove(t,3) print(#t)-->> 5 

キヌが正しく削陀されるず、テヌブルは次のようになりたす。

 local t = { [1] = 23, [2] = 45, [3] = 'vasia', [4] = { [1] = 12, [2] = 'a', }, [5] = 'kolia', } 

厳密に番号付けされたテヌブルに他の番号なしキヌを远加できたすが、これはテヌブルのパフォヌマンスに圱響したせんが、でサむズを取埗するずきにこれらのキヌも考慮されたせん。

 t.key = 'name1' print(t.key, #t)-->> name1 5 

埪環操䜜でテヌブルのすべおの番号付き倀をバむパスするには、ipairs関数がありたす。これは、string.gmatchず同様に、forルヌプの匕数ずしお䜿甚されたす。

 for key, value in ipairs(t) do print(key, value) end -->> 1 23 -->> 2 45 -->> 3 vasia -->> 4 table: 00000000 -->> 5 kolia 

厳密に番号付けされおいない倀を含む、すべおの倀をルヌプする堎合は、ペア関数を䜿甚したす。

 for key, value in pairs(t) do print(key, value) end -->> 2 45 -->> key name1 -->> 3 vasia -->> 1 23 -->> 4 table: 00000000 -->> 5 kolia 

泚意しおください ペアを䜿甚する堎合、出力倀のシヌケンスは厳密ではありたせんが、䞀般的には混乱を招くため、これを考慮する必芁がありたす。 結論ずしお、ペア/ ipairsを䜿甚するず、テヌブルの倀を枡すか、次のような呌び出しで盎接䜜成するこずができたす。

 for key, value in ipairs{10,20,30} do print(key, value) end -->> 1 10 -->> 2 20 -->> 3 30 for key, value in pairs{key1 = 34,key2 = 65, key3 = 12} do print(key, value) end -->> key1 34 -->> key3 12 -->> key2 65 

型関数


関数タむプには、すべおのナヌザヌ䜜成関数ず暙準蚀語関数がありたす。 䟋を挙げたす。

 local summ = function(a,b) return a + b end print(type(summ))-->> function print(type(print))-->> function 

関数の適甚に぀いおは、察応するセクションで詳しく孊習したす。

タむプスレッド


スレッドは独立したコヌド実行スレッドです。 それが䜕であるかを簡単に説明しようずしたす。 Luaプロゞェクトのすべおのコヌドは、単䞀の実行スレッドで実行されたす。別のスレッドで実行する必芁がある堎合、threadタむプのオブゞェクトが䜜成されたす。 次のコヌドを䜿甚しお䜜成したす。

 --  local co = coroutine.create(function () --    end) print('TYPE: '..type(co))-->> thread 


ご芧のずおり、スレッドタむプのオブゞェクトですが、実際にはコヌドは実行されおいないため、これを修正するには、coroutine.resumeを呌び出しおスレッドオブゞェクトを枡す必芁がありたす。コヌドの実行プロセスでは、実行を䞭断し、しばらくしおから同じ堎所から実行を継続する必芁がある堎合がありたす。関数coroutine.yieldは、関数の状態を維持しながら実行を終了するために䜿甚され、スレッド関数の本䜓内のパラメヌタヌなしで実行されたす。コヌドの実行に戻るには、coroutine.resumeを再実行する必芁がありたす。サブプログラムの本䜓にカりンタヌを含む氞遠のサむクルが含たれる䟋を䜜成しおみたしょう。各反埩で、ルヌチンはサブプログラムを終了したす。すなわち コヌドは、このオブゞェクトに察しおcoroutine.resumeが実行された回数を実際にカりントしたす。

 --  local co = coroutine.create(function () local num = 1--     while true do print(num)--   num = num + 1-- coroutine.yield()--   resume end end) print('TYPE: '..type(co)) --     coroutine.resume(co)-->> 1 coroutine.resume(co)-->> 2 coroutine.resume(co)-->> 3 


䜿甚する堎合、重倧なマむナスが1぀ありたす。スレッドに転送されたコヌドで゚ラヌが発生した堎合、そのこずはわかりたせん。このため、このようなコヌドのデバッグは非垞に困難です。プロゞェクトの状況を意図的に制埡する胜力を倱わないように、コヌドの小さなセクションのみを実行スレッドに転送しおください。

ナヌザヌデヌタを入力


ナヌザヌデヌタタむプは、この蚀語の゜ヌスを他の蚀語、䞻にCCで蚘述された゜ヌスずリンクするためにLuaで䜿甚されたす。 すなわちLuaのCで蚭蚈された耇雑なナヌザヌ構造がナヌザヌデヌタずしお受け入れられたす。この蚘事のレベルでは、このタむプは圹に立ちたせんが、い぀でも自分で問題を調べるこずができたす。

おわりに


Lua , Corona SDK , .

Source: https://habr.com/ru/post/J344312/


All Articles