You are on page 1of 44

Gii thiu Lua.

Lnh gn
Mt trong nhng l do m phn ln ``dn'' k thut ngi lp trnh l v nhng ngn
ng mi (C#, Java) da trn mt h thng (framework) th vin rt s. Tht
vy, bn c th xy dng nhng chng trnh c giao din rt p, vi h thng c
s d liu hin i, hay da trn cc cng ngh web mi nht... Nhng ch l
nhng phn thng ring cho ``dn'' ngnh IT, nhng ngi m s dng m lnh
vit trong mt nm cng nhiu nh s dng trong bn bo co thuyt minh np cho
i tc vy. R rng, vic trang b cho mnh mt cp knh cn > 5 i-p v mt
quyn s tay lp trnh ngn ng X. lun k k trn bn my tnh l rt khng kh
thi !
Vi ngi dn k thut (thy li, xy dng, giao thng ...), tnh linh ng l quan
trng. Nhiu bi ton k thut trong thc t cn c tnh ton s b mt cch
nhanh nht, hiu qu nht. Lp trnh? Tt nhin l cn thit ri. Nhng lp trnh
nh th no cho hiu qu nht khi ta phi bt u t mt dng m lnh u tin ?
Lua l mt gii php ha hn.
Ngn ng lp trnh Lua (c l Lu-a) ra i nm 1993 ti i hc PUC-Rio, Rio
de Janeiro, Brazil. Hin nay (chng trnh) Lua cng l mt phn mm t do:
ngi dng c quyn t do download, gi cho bn b, vit phn mm t Lua phc
v cho mc ch bt k: hc tp, nghin cu, thng mi, k c vit cc tr chi
(mt trong nhng th mnh ca ngn ng ny). Lua c nh gi l mt ngn
ng thng dch c tc vo loi nhanh nht. Mt s kt qu so snh vi ngn ng
Perl (thuc vo dng thng dch nhanh) c th c xem ti y.
Bn c th hnh dung mc nh gn ca Lua khi download phin bn chy trn
Windows t y. Mt file nn < 600 KB cha cc file exe chy chng trnh.
Khng cn phi ci t, iu ny rt tin. Chng hn khi ta mun chy chng
trnh vit t nh, trn mt my tnh khc m ta khng c quyn admin.
Trong chp mt, bn download c file Lua (lua5_1_3_Win32_bin.zip). Gii
nn vo mt th mc nh C:\Lua. Click vo file lua5.1.exe. Du nhc lnh, vi
hnh mt k hiu ln hn, s hin ra:
CODE
Lua 5.0.3 Copyright 1994-2006 Tecgraf, PUC-Rio
>
By gi hy th mt s lnh nh. Lnh c bn nht l lnh gn, n ging nh trong

(Visual)BASIC
CODE
>x=5
>
Nh vy cu lnh ng, my khng bo li v gi tr 5 c lu vo trong bin x.
Khoan , hnh nh ta thiu mt bc g ? Khai bo bin, sao li khng khai bo
bin x l s nguyn?
Cu tr li: ngay khi Lua gp lnh gn th n s cn c vo gi tr ( y l 5) m
quyt nh rng bin x c kiu s ch khng phi kiu ch. c im ny t ra rt
c li: ta s tit kim c cng g lnh m khng s nhm ln g, v trong k thut
ta vn quy nh mi bin c kiu ring ca n, khng thay i c.
Mt s lnh gn tip theo t ra rt bnh thng:
CODE
> y = 1.4 ^ 2
>z=x+y
iu g s xy ra nu ta khng vit v tri ca lnh gn? Ring trong trng hp ta
ang chy trn du nhc lnh ( > ... ) th my s khng bo li. Thay v vy, n s
hiu rng kt qu tnh c v phi khng lu vo bin no c m s in ra mn
hnh.
CODE
>=z
6.96
im c bit th hai l: mt lot cc gi tr bn c th c gn bng mt lnh
gn duy nht. Kt qu l cc bin v tri (phn cch bi du phy) c gn vi
gi tr ln lt v phi:
CODE
> m, n = 8, 6
>=m
8

>=n
6
Luyn tp 1. Lnh gn sau y c li khng? Kt qu chng t my thc hin nh
th no?
CODE
> a, b, c = 1, 2, 3, 4
Luyn tp 2. Ta nh cc lnh trn ta vit, liu ta c th vit mt lnh gi gn
nh sau khng? Ti sao?
CODE
> xx, yy, zz = 5 , 1.4^2 , xx + yy
Bn t thc hin cc php tnh trn du nhc lnh Lua. Cui cng hy th lm Qu!
z sau y:
Qu!z 1. tnh lu lng trong sng cc k s vn thng dng cng thc
T chn mt gi tr nhm t 0.02 n 0.04, su (bn knh thy lc) t 2 n
3, dc t 0.0001 n 0.0003. Tnh ra Q. Hy reply li qu trnh bn lm trn
Lua (cu lnh + kt qu) !
Bi Vit V Cc Kiu Trong Lua
y l phn gii thiu v 8 kiu gi tr c bn trong Lua: number, string, boolean,
table, function, nil, userdata, thread. Mi phn gii thiu 1 kiu khc nhau.
Chng ta s s dng hm print() xut ra cc gi tr hoc cc tnh ton trn cc
gi tr . Du ngoc () quanh cc tr s rt quan trng, nu thiu s gy ra li.
> print(2) -- xut ra s 2.
2
> print("hello") -- xut ra chui hello.
hello
Cc s (numbers)
Lua cho php cc php tnh n gin trn cc s thng qua vic s dng cc ton
t thng dng cng, tr, nhn v chia.
> print(2+2)
4

>print(2-7)
-5
> print(7*8)
56
> print(7/8)
0.875
Ch rng cc s khng c lm trn thnh s nguyn, l cc s thc. Chng
ta c th gn cc gi tr cho cc bin nh dng ton t =
>x=7
> print(x)
7
Bin x c to khi c gn s 7. Dng hm print() xut gi tr ca x. Gi
chng ta c th s dng gi tr trong x cho cc tnh ton khc.
>x=x*9
> print(x)
63
> print(x*2) s khng thay i gi tr ca x
126
> print(x)
63
Ch cch m print(x*2) khng thay i gi tr ca x v x khng c gn qua
ton t = trong khi x = x * 9 l nhn gi tr hin ti ca x (l 7) cho 9 v lu gi tr
mi vo x 1 ln na.
bit thm thng tin v kiu s trong Lua, hy n xem cc bi vit sau.
Cc chui (Strings)
Lua cng s dng cc kiu chui (v d text):
> print("hello")
hello
Chng ta c th gn cc chui cho cc bin ging nh cch lm vi cc s:
> who = "Lua user"
> print(who)
Lua user

Chng ta c th ni cc chui li vi nhau qua ton t .. gia 2 chui.


> print("hello ")
hello
> print("hello " .. who) bin who c gn trn
hello
Lua user
> print(who)
Lua user
Ch rng ton t .. khng thay i gi tr ca mu tin nu khng s dng ton t
= (cng nh cc s).
> message = "hello " .. who
> print(message)
hello Lua user
Khng nh 1 s ngn ng khc, bn khng th s dng ton t cng ni cc
chui. V d nh li trong dng lnh di y:
> message = "hello " + who
stdin:1: attempt to perform arithmetic on a string value
stack traceback:
stdin:1: in main chunk [C]: ?
bit thm thng tin v kiu chui trong Lua, hy n xem cc bi vit sau.
Lun l (Boolean)
Cc gi tr lun l c 1 trong 2 gi tr l true hoc false. Nu 1 gi tr khng phi l
true th n s phi l false v ngc li. Ton t not c th c t trc 1 gi tr
lun l ph nh (hay o ngc) n. V d not true ng ngha vi false.
> x = true
> print(x)
true
> print(not x)
false
> print(notfalse)

true
Cc gi tr lun l c s dng th hin kt qu cc kim tra logic. Cc ton t
bng == v khng bng ~= s tr li cc gi tr lun l ph thuc vo cc gi tr
c cp.
> print(1 == 0) - kim tra 2 s c bng nhau khng
false
> print(1 == 1)
true
> print(1 ~= 0) - kim tra 2 s khng bng nhau hay khng
true
> print(true ~= false) - true khng bng false?
true
bit thm thng tin v kiu lun l trong Lua, hy n xem cc bi vit sau.
Cc bng (Tables)
Lua c 1 kiu d liu tng th a dng (general-purpose aggregate) gi l 1 Table.
Cc kiu d liu tng th c s dng cho vic lu tr cc tp hp (nh cc danh
sch, cc mng, cc thit t, cc mng lin kt). Lua l mt ngn ng n trong
cc bng c s dng th hin hu ht cc kiu tng th khc.
Cc bng c to s dng cp ngoc nhn { } . Chng ta hy to 1 bng rng:
> x = {}
> print(x)
table: 0035C910
(s l bnh thng nu bng ca bn khng c cng nh danh nh trong v d
trn.)
Khi chng ta th hin gi tr bng dng cch built trong hm print, Lua ch biu
din l 1 bng v nh danh cho bng (v d a ch ca n trong b nh).
Chng ta c th xut ra ni dung ca bng nhng s tm hiu trong cc bi sp ti.
Chng ta c th xy dng bng cha cc i tng khc, chng hn nh cc s v
cc chui c m t trong v d di y
> x = { value = 123, text = "hello" }
> print(x.value)
123

> print(x.text)
hello
Chng ta c th xut cc gi tr thng qua c php: table.item. Chng ta cng c
th t cc bng trong cc bng khc.
> y = { const={ name="Pi", value=3.1415927 }, const2={ name="light speed",
value=3e8 } }
> print(y.const.name)
Pi
> print(y.const2.value)
300000000
bit thm thng tin v kiu bng trong Lua, hy n xem cc bi vit sau..
Cc hm (Functions)
Trong lua, cc hm c gn vo cc bin, ging nh s v chui. Cc hm c
to thng qua t kha function. y chng ta to 1 hm n gin xut ra 1 li
cho.
> function foo() print("hello") end - khai bo hm
> foo() - Gi hm
hello
> print(foo) - nhn gi tr ca bin "foo"
function: 0035D6E8
Ch rng chng ta c th xut gi tr ca bin foo v n biu din (nh cc bng)
gi tr l 1 hm, v c nh dng cho hm . Vy, l 1 gi tr nh mi gi tr khc,
chng ta c th gn cc hm cho cc bin.
> x = function() print("hello") end
> x()
hello
> print(x)
function: 0035EA20
Kh nng lm iu ny l v Lua c cc gi tr lp u tin (first class values).
iu ny c ngha l tt c cc gi tr c x l cng cch. y chnh l 1 c
im rt hu dng v mnh ca Lua.

thm thng tin v kiu hm trong Lua, hy n xem cc bi vit sau.


Cc gi tr rng (nil values)
nil l 1 gi tr c bit ch ra khng gi tr (no value). Nu 1 bin c gi tr rng
l n khng c gi tr gn vo, v th s khng cn tn ti (hoc cha tn ti). Bng
vic t 1 bin thnh rng, bn c th delete bin. V d.
> x = 2.5
> print(x)
2.5
> x = nil
> print(x)
nil
Bn cng c th kim tra 1 bin c tn ti hay khng thng qua vic kim tra gi
tr ca n c phi nil hay khng.
> print(x == nil)
true
>x=7
> print(x == nil)
false
> print(x)
7
D liu t to (Userdata)
Cc gi tr d liu t to l cc i tng bn ngoi Lua, nh cc i tng c
thc hin trong C. Xy ra khi mt i tng trong 1 th vin C c t vo Lua.
1 v d ca 1 gi tr userdata l 1 x l file (file handle). 1 userdata thng c
xem nh 1 bng, v bn c th loi b phn ln s khc bit nu tr phi ang s
dng. Mun tham kho thm phn ny, n xem cc bi vit sau.
Xu chui (Thread)
1 gi tr xu chui th hin 1 xu chui c lp vi vic thc thi. S bn su hn
trong bi sau.
Dynamic typing

Bn c th ch khi chng ta to cc bin trong cc v d trn, chng ta khng


ch ra kiu bin ang to. V d
a=1
b = "hello"
c = { item1="abc" }
Trong cc ngn ng khc, nh C, chng ta phi ch ra kiu ca 1 bin khi to ra n.
Trong Lua, chng ta c th gn nhiu kiu gi tr khc nhau cho cng 1 bin, v d
a=1
a = "hello"
a = { item1="abc" }
y c gi l dynamic typing. C ngha l bn khng phi ch ra bin ang
thuc kiu no. Bin nhn dng c kiu thng qua gi tr, hoc i tng c
gn vo.
Truy vn kiu (Querying type)
V Lua l 1 ngn ng ni suy, chng ta c th dng hm type() ly ra kiu ca 1
i tng c th.
> x = "123" -- 1 chui
> print(x, type(x)) - cho ra gi tr ca x v kiu ca n
123 string
> x = x + 7 -- cng 1 s vo chui 1 cc cng bc
> print(x, type(x)) - li cho ra gi tr v kiu
130 number
Dng lnh lua (Lua command line)
Nu chng ta chy thi hnh Lua khng c cc thng s, chng ta s nhn c mu
tin v 1 du nhc lnh >
Lua 5.0 Copyright 1994-2003 Tecgraf, PUC-Rio
>
Tt c cc v d trong bi c nh ti du nhc lnh > v c copy past vo
bi.

> print("hello Lua user")


hello Lua user
> print(10*10)
100
Nu 1 dng bt u vi du =, Lua s hiu dng l 1 din t. y l 1 cch
thay th cho hm print().
> = "hello Lua user"
hello Lua user
> = 10*10
100
Mc a dng (Multiline entry)
Chng ta c th g cc dng lnh trn nhiu dng. Lua s th c chng nhng g
bn g trn 1 dng v xc nh xem lnh c hon tt cha. Nu cha, mt du
nhc i xut hin >> v bn c th tip tc g. V d.
> print(
>> "Hello lua user"
>> )
Hello lua user
Trong v d trn, print( cha hon tt v thiu du ngoc ng ). Dng lnh Lua gi
thit bn phi g thm na nn du >> c hin th. iu ny tip tc cho n khi
hon tt statement. Nu bn lm 1 li, kt qu s sai. Nh di y:
> = 10 *
>> 10 +
>> 5
105
Cc Ch thch (Comments)
Ch no bn thy "--", theo sau l text, y l cc comment (bnh lun, ch thch).
Mi th theo sau -- s b b qua khi chy chng trnh.
> = 1+1 -- ci ny b qua

> = 1+1 no comment


stdin:1: <eof> expected near `no'
Ch thch: Dng bo li trn, bn khng c g comment vo! Cc comment ch
yu lm cho chng trnh r rng hn.
Gn Gi Tr
Gn cc gi tr (Assigning values)
Vic t gi tr ca 1 bin c gi l gn gi tr: (assignment):
>x=1
> y = "hello"
> print(x,y)
1 hello
a Gn, Gn bi (Multiple assignment)
Trong Lua, chng ta c th tin hnh gn nhiu gi tr trong 1 pht biu
(statement). V d
> x, y = 2, "there"
> print(x,y)
2 there
Danh sch cc gi tr bn phi c gn cho danh sch cc bin bn tri du =.
Chng ta c th gn bao nhiu gi tr ty thch v chng khng nht thit phi cng
kiu, v d
> a,b,c,d,e,f = 1,"two",3,3.14159,"foo",{ this="a table" }
> print(a,b,c,d,e,f)
1 two 3 3.14159 foo table: 0035BED8
Cc gi tr bn phi ca du = c th l nhng biu thc nh i+1, nhng nhng gi
tr bn tri th khng th.
a gn c 1 s hnh thc sau:
Tnh ton trc khi gn (Evaluation occurs before assignment)
Mi biu thc c tnh ton trc, sau mi c gn.

>i=7
> i, x = i+1, i
> print(i, x)
87
Khi Lua chy n dng th 2, n tnh ton biu thc i + 1 v i trc nhng ci
khc. Sau khi tnh ton, dng th 2 s thnh i, x = 8, 7. Sau n tin hnh gn gi
tr t phi qua tri. (xem pha di v th t gn)
Hon chuyn cc gi tr (Swapping values)
V cc gi tr c gn gn nh ng thi, nn bn c th s dng a gn hon
i cc gi tr bin vi nhau.
> a,b = 1,2 -- t gi tr ban u
> print(a,B)
12
> a,b = b,a -- hon i ln nhau
> print(a,B)
21
> a,b = b,a -- v lm ln na
> print(a,B)
12
Ch rng khng cn n 1 bin tm thi (nh l bold = b; b =a; a = bold nh
trong ngn ng C.
Th t gn (Assignment order)
Th t trong a gn l khng xc nh. C ngha l bn khng nn cho rng cc
php gn c tin hnh t tri qua phi; nu cng bin hoc bng tham chiu xut
hin 2 ln trong danh sch gn, bn c th s ngc nhin v kt qu.
> a, a = 1, 2
> print(a)
1
Trong v d trn, Lua gn t phi qua tri, a = 2 v sau a =1, nhng chng ta
khng nn ph thuc vo dng ny trong cc phin bn tip theo ca Lua. Nu th
t gn l quan trng th bn nn s dng cc pht biu gn ring bit.
Trng hp c bit, xem cc pht biu sau. Nu i == j, 2 pht biu ny c th lm

khc nhau:
> table[i], table[j] = table[j], table[k]
> table[j], table[i] = table[k], table[j]
Nn vit thnh 2 pht biu ring. iu ny lun hon chuyn 2 gi tr, qua:
> table[i], table[j] = table[j], table[i]
Kch thc danh sch khng trng khp (Mismatched list sizes)
Nu 1 danh sch gi tr di hn danh sch bin th nhng gi tr d s b b qua.
> a,b,c = 1,2,3,4,5,6
> print(a,b,c)
123
Nu 1 danh sch gi tr ngn hn danh sch bin, Lua s gn gi tr rng (nil) cho
cc bin khng c gi tr.
> a,b,c,d = 1,2
> print(a,b,c,d)
1 2 nil nil
Bi vit v cc s
Mt s ngn ng h tr 1 hoc nhiu cc kiu s mc nh sau:
S nguyn (Integer )
S nguyn chnh xc v hn (Unlimited precision integer )
Chm ng c chnh xc n (Single precision floating point)
Chm ng c chnh xc i (Double precision floating point)
Cc s phc (Complex numbers)
Lua ch h tr ch 1 kiu s l cc s chm ng (floating point numbers). Mc
nh l c chnh xc i (Double precision floating point numbers Double)
nhng Lua c th d dng bin dch li h tr cc s chm ng c chnh xc
n (single precision floating point numbers Single) nh bn mong mun. Nu
bn xa l vi cc s chm ng, tui xin gii thch s nh th ny:
Cc s thc l cc s c cha phn thp phn, gia phn thp phn v phn nguyn
ngn cch bi du chm (decimal point US).Thut ng du chm ng bt ngun
t thc t l khng c s con s c nh trc hoc sau du chm phn cch thp

phn, nn du chm c th ng. (do ngi M dng du chm phn cch thp
phn nn mi gi chm ng, ngi VN chc s dng phy ng). N khc vi s
nguyn l cc s chm c nh (fixed point numbers) do s ch s sau du chm
lun = 0.
Cn Single v Double? Khi biu din cc s chm ng ngi ta dng s lng bit
gi phn thp phn, cng nhu bit dc s dng th kt qu biu din cng chnh
xc. Double l s dng s bit gp i so vi single v th nn phm vi biu din
rng hn v chnh xc cao hn single.
S phc (complex numbers) l phn m rng ca s thc thu c qua vic ni
mt n v o (imaginary unit) k hiu l i v tha mn : i^2 = -1. Mi s phc
c biu din di dng a + bi trong a, b l cc s thc c gi l phn thc
v i l phn o.
S nguyn (Integer) l tp hp cc s t nhin bao gm s 0 v phn m ca
chng. S nguyn khi vit s khng c phn thp phn.
S dng cc s
Chng ta c th s dng dng lnh Lua tnh ton thng qua cc biu thc v d
Lua 5.1 Copyright 1994-2006 Lua.org, PUC-Rio
>=1
1
>=1+2
3
> = 3.1415927
3.1415927
>=5/6
0.83333333333333
Chng ta c th nhp s v thc hin cc php tnh n gin. Lua cng c th hiu
cc kiu s m trong cc s biu din di dng <gi tr> * 10^ <s m>
> = 1.2345e6
1234500
> = 543.21E8
54321000000
> = 2.56e-4

0.000256
Chng ta c th gn cc s cho cc bin v thc hin php tnh:
> width = 7.5
> height = 12.7
> = width * height
95.25
> depth = 2.8
> area = width * height
> volume = area * depth
> print(area, volume)
95.25 266.7
Th vin ton hc (The math library)
Lua c trang b 1 th vin Ton hc vi cc hm nh sau:
math.abs
Tr v gi tr tuyt i hoc gi tr khng m ca gi tr nhn vo.
> = math.abs(-100)
100
> = math.abs(25.67)
25.67
> = math.abs(0)
0
math.acos , math.asin
Tr v nghch o cos v sin ca gi tr a vo.
> = math.acos(1)
0
> = math.acos(0)
1.5707963267949
> = math.asin(0)
0
> = math.asin(1)

1.5707963267949
math.atan , math.atan2
Tr v nghch o tang. Chng ta c th lm c bng cch cung cp y/x s dng
math.atan hoc c th truyn y v x vo math.atan2
> c, s = math.cos(0.8), math.sin(0.8)
> = math.atan(s/c)
0.8
> = math.atan2(s,c)
0.8
math.atan2 c a chung hn, c bit khi chuyn ta vung gc sang ta
c cc. math.atan2 s dng du ca c hai tham s t kt qu vo ng gc
phn t v cng to ra cc gi tr ng khi 1 trong 2 tham s l 0 hoc rt gn 0.
> = math.atan2(1, 0), math.atan2(-1, 0), math.atan2(0, 1), math.atan2(0, -1)
1.5707963267949 -1.5707963267949 0 3.1415926535898
math.ceil , math.floor
Tr v s nguyn ln hn hoc nh hn gn nht gi tr a vo.
> = math.floor(0.5)
0
> = math.ceil(0.5)
1
math.cos , math.sin , math.tan
Tr v gi tr cos, sin v tang ca gi tr a vo di dng radian.
> = math.cos(math.pi / 4)
0.70710678118655
> = math.sin(0.123)
0.12269009002432
> = math.tan(5/4)
3.0095696738628
> = math.tan(.77)

0.96966832796149
math.cosh , math.sinh , math.tanh
Tr v gi tr cos, sin v tang hyperbolic t gi tr a vo.
> = math.sinh(1)
1.1752011936438
math.deg , math.rad
Chuyn t radian sang v ngc li.
> = math.deg(math.pi)
180
> = math.deg(math.pi / 2)
90
> = math.rad(180)
3.1415926535898
math.exp , math.log
math.exp() tr v gi tr ca e m gi tr nhp.
math.log() tr v gi tr logarithm c s e ca gi tr nhp vo.
> = math.exp(0)
1
> = math.exp(1)
2.718281828459
> = math.exp(27)
532048240601.8
> = math.log(532048240601)
26.999999999998
> = math.log(3)
1.0986122886681
math.log10
Tr v logarithm bc 10 ca 1 s. S nhp vo phi dng.

> = math.log10(100)
2
> = math.log10(256)
2.4082399653118
> = math.log10(-1)
-1.#IND
math.pow , x^y
math.pow() tr v gi tr ca x m y, tng t vi ton t ^. math.pow(x,y) ==
x^y.
> = math.pow(100,0)
1
> = math.pow(7,2)
49
> = math.pow(2,8)
256
> = math.pow(3,2.7)
19.419023519771
>=5^2
25
> = 2^8
256
math.min , math.max
Tr v gi tr nh nht hay ln nht t cc tham s truyn vo.
> = math.min(1,2)
1
> = math.min(1.2, 7, 3)
1.2
> = math.min(1.2, -7, 3)
-7
> = math.max(1.2, -7, 3)
3
> = math.max(1.2, 7, 3)
7

math.modf
Tr v phn nguyn v phn thp phn ca s nhp vo.
> = math.modf(5)
50
> = math.modf(5.3)
5 0.3
> = math.modf(-5.3)
-5 -0.3
math.sqrt
Tr v gi tr cn bc 2 ca s nhp vo. Ch cho php s khng m.
> = math.sqrt(100)
10
> = math.sqrt(1234)
35.128336140501
> = math.sqrt(-7)
-1.#IND
math.random , math.randomseed
math.random() to ra nhng s ngu nhin. Nhng tham s truyn vo s thay i
gi tr xut:
math.random() khng c tham s s to ra 1 s thc nm trong khong 0 v 1.
math.random(upper) to ra cc s nguyn ln hn 1.
math.random(lower, upper) to ra cc s nguyn nm trong khong gia lower v
upper.
> = math.random()
0.0012512588885159
> = math.random()
0.56358531449324
> = math.random(100)
20
> = math.random(100)
81

> = math.random(70,80)
76
> = math.random(70,80)
75
upper v lower phi l s nguyn.
Hm math.randomseed() t mt seed cho vic to s ngu nhin. Cc seed bng
nhau s cho cc chui s bng nhau.
> math.randomseed(1234)
> = math.random(), math.random(), math.random()
0.12414929654836 0.0065004425183874 0.3894466994232
> math.randomseed(1234)
> = math.random(), math.random(), math.random()
0.12414929654836 0.0065004425183874 0.3894466994232
Mt seed tt l os.time(), nhng phi ch 1 giy trc khi gi hm thu c 1
trnh t khc! ly c s ngu nhin p dng:
math.randomseed( os.time() )
math.frexp , math.ldexp
y l nhng hm chun ha. Hm math.frexp() c s dng tch gi tr s
thnh 1 phn nguyn chun v 1 s m. 2 gi tr c tr v: gi tr u nm trong
khong n 1 v gi tr th 2 l mt s m. Hm math.ldexp() ly 1 gi tr chun
v tr v biu hin chm ng. y l gi tr c nhn cho 2 m s m.
> = math.frexp(2)
0.5 2
> = math.frexp(3)
0.75 2
> = math.frexp(128)
0.5 8
> = math.frexp(3.1415927)
0.785398175 2
> = math.ldexp(0.785,2)
3.14
> = math.ldexp(0.5,8)
128

math.huge
math.huge l 1 hng s, biu din +v cc.
> = math.huge
inf
> = math.huge / 2
inf> = -math.huge
-inf
> = math.huge/math.huge -- indeterminate
nan
> = math.huge * 0 -- indeterminate
nan
> = 1/0
inf
> = (math.huge == math.huge)
true
> = (1/0 == math.huge)
true
Ch rng mt s ton t trn math.huge tr v gi tr c bit khng phi l 1 s
c biu din l nan. Nan l 1 kiu s, khc cc kiu s khc:
> = type(math.huge * 0)
number
math.pi
y l hng s PI.
> = math.pi
3.1415926535898
Chuyn i (Conversion)
Bn c th chuyn i chui ra s s dng hm tonumber(). N s ly 1 tham s
chui v tr v 1 s.
> = tonumber("123") + 25
148

> x = tonumber("123.456e5")
> print(x)
12345600
Tnh gng p (Coercion)
Lua s t chuyn i cc kiu chui v s tin hnh cc tnh ton. V d, nu
bn th p dng mt ton t cho 1 chui, Lua s c chuyn chui thnh s
trc, nu khng php ton s khng thc hin. Nu chui khng th chuyn thnh
s, mt thng bo li se xut hin. S t ng chuyn i kiu d liu ny c
gi l gng p (coercion).
> = 100 + "7"
107
> = "1000" + 234
1234
> = "hello" + 234
stdin:1: attempt to perform arithmetic on a string value
stack traceback:
stdin:1: in main chunk
[C]: ?
> = 234 + "1000"
1234
Bn c th thy ch 1 chui chuyn c thnh s, tnh ton thnh cng. Chui
hello khng chuyn c thnh s nn b li. Trong cc ngn ng kiu thng
k (nh C), iu ny s b li do bn khng th gn 1 gi tr cho 1 bin m khng
cng kiu. Lua lm c v n thuc kiu ng.
1 ngoi l ng ch : Cc ton t so snh (== ~= < > <= >=) khng gng p
c cc tham s ca chng. Ton t == s xem nh 1 s khng bng vi s
biu din dng chui ( hay bt k kiu biu din ko phi kiu s). Cc ton t so
snh tun t s bo li khi bn nhp cho chng cc kiu khc nhau.
> = 100 == "100"
false
> = 100 ~= "hello"
true
> = 100 ~= {}
true
> = 100 == tonumber("100")

true
> = 100 <= "100"
stdin:1: attempt to compare number with string
stack traceback:
stdin:1: in main chunk
[C]: ?
Bi Vit V Chui (Strings)
Cc du ngoc (Quotes)
Cc chui c xc nh qua du nhy n, i, hoc 2 cp ngoc vung
> = "hello"
hello
> = 'hello'
hello
> = [[hello]]
hello
cho php bn t 1 trch dn trong nhng ci khc, v d
> = 'hello "Lua user"'
hello "Lua user"
> = "Its [[content]] hasn't got a substring."
Its [[content]] hasn't got a substring.
> = [[Let's have more "strings" please.]]
Let's have more "strings" please.
Cc trnh t ngt (Escape sequences)
Lua cng c cc trnh t thot ging nh C.
> = "hello \"Lua user\""
hello "Lua user"
> = 'hello\nNew line\tTab'
helloNew line Tab
Cc trnh t ngt khng c nhn dng khi s dng cp ngoc vung:
> = [[hello\nNew line\tTab]]
hello\nNew line\tTab
Ngoc a dng (Multiline quotes)

2 cp ngoc vung c th s dng bao cc chui tri trn nhiu dng, v d:


> = [[Multiple lines of text
>> can be enclosed in double square
>> brackets.]]
Multiple lines of textcan be enclosed in double squarebrackets.
Cc ngoc lng (Nesting quotes)
2 cp ngoc vung cho php lng vo nhau nhng cn phi chn thm du = vo
k du ngoc ngoi cng phn bit chng. C bao nhiu du = chn vo cng
c min l phi m bo c du = cc ngoc vung bt u v kt thc.
> = [[one [[two]] one]] -- ko c
stdin:1: nesting of [[...]] is deprecated near '['
> = [=[one [[two]] one]=] -- ok
one [[two]] one
> = [===[one [[two]] one]===] -- ok lun
one [[two]] one
> = [=[one [ [==[ one]=] -- ok.
one [ [==[ one
S lin kt (Concatenation)
Cc chui c th ni vi nhau thng qua ton t lin kt .. v d
> = "hello" .. " Lua user"
hello Lua user
> who = "Lua user"
> = "hello "..who
hello Lua user
Cc s c th lin kt vo cc chui. Trong trng hp ny, s b p thnh chui
v sau c gn vo chui.
> = "Green bottles: "..10
Green bottles: 10
> = type("Green bottles: "..10)
string
Ch rng vic lin k cc chui ln c th lu hn vic thm cc chui vo 1
mng v truy cp sau . Nh v d sau:

newtable = {}function insertmany(ttable, ...)


for var i = 1, getn(arg) do
tinsert(ttable, arg)
end
end
insertmany(newtable, 'Hello world! ', 'The first time ', 'is always ', 'the best. ',
'Never ', ' say ', 'never ', 'again.')
for var i, getn(newtable) do
write(newtable)
end
Th vin chui (The string library)
Lua cung cp 1 th vin hm rt hu ich cho vic x l v thao tc trn chui.
Ch : Trong Lua, chui c nh s bt u t 1, khng phi 0 nh trong C.
string.byte(s [, i [, j]])
s:byte([, i [, j]])
Tr v m dng s ca ch th i n th j ca chui s truyn vo.
> = string.byte("ABCDE") -- khng c s th t, nn s ly ch u
65
> = string.byte("ABCDE",1) -- bt u t 1
65
> = string.byte("ABCDE",0) -- khng c ch no
> = string.byte("ABCDE",100) -- ngoi gii hn nn ko c gi tr
> = string.byte("ABCDE",3,4)
67 68
> s = "ABCDE"
> = s:byte(3,4) -- c th p dng trc tip trn bin chui
67 68
string.char(i1, i2, ...)
To ra chui th hin t cc m k t c truyn vo trong tham s.
> = string.char(65,66,67)
ABC

> = string.char() -- chui rng


string.dump(function)
Tr v dng nh thc ca hm nhp vo, chui load trn chui s tr v 1 bn
sao ca hm. Hm phi l hm Lua khng tr gi tr. (??????)
string.find(s, pattern [, init [, plain]])
s:find(pattern [, init [, plain]])
Tm xem c chui tha mn pattern trong chui nhp vo. Nu tm thy, s tr v
cp gi tr biu din cho v tr bt u v kt thc ca pattern tm dc trn chui
nhp vo. Nu khng s tr v nil.
> = string.find("Hello Lua user", "Lua")
79
> = string.find("Hello Lua user", "banana")
nil
Tham s th 3 init biu din v tr bt u tm trn chui, init c bt u l 1 v c
th l s m (s m ngc t cui chui tr ln).
> = string.find("Hello Lua user", "Lua", 1) -- bt u t ch u tin
79
> = string.find("Hello Lua user", "Lua", 8) -- "Lua" khng c tm thy sau ch
th 8
nil
> = string.find("Hello Lua user", "e", -5) -- "e" u tin tnh t k t th 5 t cui
m ln
13 13
Tham s patern cng c th cho php nhng tm kim phc tp hn. Chng ta c
th tt nhng c tnh biu thc bnh thng thng qua tham s th 4 plain. Plain
nhn gi tr lun l v phi c dn bng init. V d
> = string.find("Hello Lua user", "%su") -- tm 1 k t khong trng v c ch u
theo sau
10 11
> = string.find("Hello Lua user", "%su", 1, true) - bt tm kim plain, ko c kt
qu no tm thy

nil
string.format(formatstring, e1, e2, ...)
formatstring:format(e1, e2, ...)
To ra chui c nh dng theo nh dng v tham s truyn vo. N ging vi
hm printf(format,) trong C. %q l t du ngoc kp quanh 1 gi tr ca
chui tham s.
c, d, E, e, f, g, G, i, o, u, X, v x tt c cn 1 s lm tham s.
q v s cn 1 chui.
> = string.format("%s %q", "Hello", "Lua user!") -- chui v chui c ng
ngoc
Hello "Lua user!"
> = string.format("%c%c%c", 76,117,97) -- k t
Lua
> = string.format("%e, %E", math.pi,math.pi) -- s m
3.141593e+000, 3.141593E+000
> = string.format("%f, %g", math.pi,math.pi) -- ng (float) v ng rt gn
(compact float)
3.141593, 3.14159
> = string.format("%d, %i, %u", -100,-100,-100) -- s nguyn c du, c du,
khng du
-100, -100, 4294967196
> = string.format("%o, %x, %X", -100,-100,-100) -- octal, hex, HEX
37777777634, ffffff9c, FFFFFF9C
string.gmatch(s, pat)
s:gmatch(pat)
Tr v 1 chui tha pat thng qua vng lp. Vng lp s tm ht chui truyn vo
theo gi ca pat bn truyn vo.
> for word in string.gmatch("Hello Lua user", "%a+") do
print(word) end
HelloLuauser
V cc pattern (mu) v vng lp for s ni c th trong cc bi sau
string.gsub(s, pattern, replace [, n])
s:gsub(pattern, replace [,n])

y l 1 hm rt mnh v c th c s dng theo nhiu cch. n gin n c th


thay 1 gi ca pattern a vo bng 1 gi tr khc. 1 cp gi tr c tr v l
chui c sa i v s ln thay th, tham s n c th c s dng gii hn
s ln thay th:
> = string.gsub("Hello banana", "banana", "Lua user")
Hello Lua user 1
> = string.gsub("banana", "a", "A", 2) -- gii hn s ln thay l 2
bAnAna 2
Nh string.find(), chng ta c th s dung cc biu thc thng thng tm trong
chui. Nu s dng 1 capture c th tham kho cch thay chui s dng c php
%capture_index, v d
> = string.gsub("banana", "(an)", "%1-") -- bt gi mi ch "an" v thay th
ban-an-a 2
> = string.gsub("banana", "a(n)", "a(%1)") -- ng ngoc quan cc k t n no theo
sau cc k t a
ba(n)a(n)a 2
> = string.gsub("banana", "(a)(n)", "%2%1") - o ngc mi ch "an"
bnanaa 2
Nu s thay th l 1 hm, khng phi chui, tham s truyn vo hm l mi bt gi
c to. Nu hm tr v 1 chui th gi tr c tr v l s thay th tr li chui.
> = string.gsub("Hello Lua user", "(%w+)", print) -- xut ra mi t tm thy
HelloLuauser 3
> = string.gsub("Hello Lua user", "(%w+)", function(w) return string.len(w) end)
- tr v di ca t
5343
> = string.gsub("banana", "(a)", string.upper) -- bin tt c cc ch a thnh ch
hoa
bAnAnA 3
> = string.gsub("banana", "(a)(n)", function(a,B) return b..a end) - o ngc mi
ch an
bnanaa 2
Bt gi theo pattern, ta thy hu ht pattern bt gi u l (.-), v d {(.-)} ngha l
bt gi mi k t nm gia cp ngoc {}. 1 pattern khc i khi cng gp l (.*)

ngha l bt gi mi th bao gm cc du ngoc c tm thy. Xem th 2 v d


sau:
> = string.gsub("The big {brown} fox jumped {over} the lazy {dog}.","{(.-)}",
function(a) print(a) end )
brown over dog
> = string.gsub("The big {brown} fox jumped {over} the lazy {dog}.","{(.*)}",
function(a) print(a) end )
brown} fox jumped {over} the lazy {dog
string.len(s)
s:len()
Tr v di chui.
> = string.len("Lua")
3
> = string.len("")
0
> = string.len("Lua\000user") -- Chui lua l 8 bit nn \000 b loi b
8
string.lower(s)
s:lower()
Chuyn ch hoa thnh ch thng.
> = string.lower("Hello, Lua user!")
hello, lua user!
string.match (s, pattern [, init])
s:match(pattern [, init])
Tm pattern ph hp u tin ca chui s, nu c s tr ra kt qu theo pattern,
ngc li s l rng. Tham s init biu th v tr bt u tm trn chui s, mc nh
l 1
>= string.match("foobarfooo","foo(.*)fooo") - tr v cc ch nm gia foo v
fooo
bar

string.rep(s, n)
s:rep(n)
To ra chui t vic ni n bn sao ca chui truyn vo.
> = string.rep("Lua ",5)
Lua Lua Lua Lua Lua
> = string.rep("Lua\n",3)
LuaLuaLua
string.reverse(s)
s:reverse(s)
o ngc chui.
> = string.reverse("lua")
aul
string.sub(s, i [, j])
s:sub(i [,j])
Tr v chui con ca chui s truyn vo. Chui con c bt u t i v kt thc
ti j. Nu khng c tham s j th chui con s kt thc ti v tr kt thc ca chui
truyn vo.
> = string.sub("Hello Lua user", 7) -- t ch th 7 cho n ht chui
Lua user
> = string.sub("Hello Lua user", 7, 9) -- t ch th 7 n ch th 9
Lua
> = string.sub("Hello Lua user", -8) -- ch th 8 tnh t cui n ht
Lua user
> = string.sub("Hello Lua user", -8, 9) -- ch th 8 tnh t cui n ch th 9 tnh
t u
Lua
> = string.sub("Hello Lua user", -8, -6) - ch th 8 tnh t cui n ch th 6 tnh
t cui
Lua
string.upper(s)

s:upper()
Chuyn cc ch trong chui s thnh ch hoa.
> = string.upper("Hello, Lua user!")
HELLO, LUA USER!
Bi vit v cc bng
To bng (Creating tables)
Cc bng c ta qua cc cng c xy dng bng, c xc nh qua cc du
ngoc nh {}. nh ngha 1 bng rng, chng ta c th lm nh sau.
> t = {} -- xy dng 1 bng rng v gn gi vo bin t
> print(t)
table: 0035AE18
Ch khi gi tr ca bng c hin th, ch c kiu v n v id ca i tng
c hin th. xut ra ni dung ca bng, chng ta phi lm tht r rng. Chng
ta s cng hc cch lm sau.
Cc bng nh cc mng (Tables as arrays)
Cc bng c th c s dng gi cc mng thng tin. Cc cu trc bng c th
cha 1 danh sch cc i tng c phn cch nhau qua du phy to 1 mng.
C th truy cp cc phn t mng qua vic dng cp ngoc vung, c php
table[index]. V d:
> t = { 1,1,2,3,5,8,13 }
> print( t[1] )
1
> print( t[0] )
nil
> print( t[4] )
3
Ch rng th t lit k trong bng bt u ti 1, khng phi 0. t[0] c gi tr nil v
khng c phn t no ti v tr th 0. Dng t = { 1,1,2,3,5,8,13 } tng ng vi:
> t = {}

> t[1]=1 t[2]=1 t[3]=2 t[4]=3 t[5]=5 t[6]=8 t[7]=13


S dng cc cng c to bng t hiu qu nhng li t li hn.
Chng ta c th tm ra kch thc ca 1 bng qua hm th vin bng chun nh
ton t # (v d ly s lng cc phn t)
>=#t
7
Chng ta c th gn cc phn t mi vo mng bng qua hm
table.insert(table,value).
> table.insert(t,21)
>=#t
8
> = t[7], t[8]
13 21
Chng ta cng c th chn cc phn t ti 1 v tr nh trc trong danh sch.
Chng ta c th dng th vin bng chn cc phn t vo mng m khng cn
xo trn cc phn t khc xung quanh. lm u ny, chng ta cung cp 3 tham
s cho hm table.insert(table,position,value). Chng ta cng c th dng
table.remove(table,position) loi b cc phn t khi mng bng.
> table.insert(t,4,99)
> = t[3], t[4], t[5]
2 99 3
> table.remove(t,4)
> = t[3], t[4], t[5]
235
Chng ta c th lp qua cc phn t cha trong mng nh ton t ipairs(). Ton t
ny s cung cp kha lit k next, trong sp xp tng dn, mi ln c gi.
> for i,v ini pairs(t) do print(i,v) end
11
21
32
43
55

68
7 13
8 21
Ch rng chng ta khng b gii hn phi s dng 1 kiu d liu trong 1 mng.
Chng ta vn c th chn cc s, chui, hm hoc cc bng khc, v d
> t[4] = "three"
> t[6] = "eight"
> t[2] = { "apple", "pear", "banana" }
> for i,v in ipairs(t) do print(i,v) end
11
2 table: 0035DFE8
32
4 three
55
6 eight
7 13
8 21
Cc bng nh cc t in (Tables as dictionaries)
Cc bng cng c th c s dng lu tr thng tin khng c sp xp nh
cc s hoc trnh t nh trong cc mng. Nhng kiu lu tr ny i khi c gi
l cc t in, cc mng lin kt, cc bng hash hoc cc kiu nh x. Chng ta s
s dng thut ng t in trong 1 cp phn t pair c 1 kha key v 1 gi tr
value. Kha key c s dng t v nhn 1 gi tr lin kt vi n. Ch rng
nh cc mng, chng ta c th dng table[key] = value chn cc phn t vo
bng. Kha khng nht thit l s, n c th l chui hoc bt k i tng Lua
no (ngoi tr nil hoc 0/0). Chng ta hy to 1 bng vi 1 vi cp kha gi tr
trong :
> t = { apple="green", orange="orange", banana="yellow" }
> for k,v in pairs(t) do print(k,v) end
apple green
orange orange
banana yellow
Ch rng chng ta phi s dng pairs(), thay v ipairs() xut gi tr. l v
cc kha key khng cn l cc s na, bn cnh ipairs() ch lp qua cc ch s

trong 1 bng trong khi pairs() lp qua cc kha key trong bng. Ch , khng c
bo m cho th t cc kha s lu trong bng khi dng cc t in, v th nn th
t vic ly cc kha qua pairs() khng c bo m. Cnh bo ny thm ch p
dng cho c phn c lit k ca bng hoc c bng khng phi dng t in m
ch c cc ch s dng nh cc kha key.
> t.melon = "green"
> t["strawberry"] = "red"
>for k,v in pairs(t) do print(k,v) end
melon green
strawberry red
apple green
orange orange
banana yellow
Bn cng c th tham kho table.foreach()tng t nh pairs(), vi tt c cc cnh
bo. Hm ny trong tng lai c th b loi b trong cc phin bn Lua sau ny.
Dng table.key = value l dng rt gn cho table["key"] = value khi kha key l 1
chui, v d t.apple kh c hn 1 cht so vi t["apple"]. Dng c php thn thin
ny lm Lua d c hn. Trong v d:
> t = { apple="green", orange="orange", banana="yellow" }
cng ging nh:
> t = { ["apple"]="green", ["orange"]="orange", ["banana"]="yellow" }
Ch , nu kha key c cha khong trng, chng ta phi dng dng
["key"]=value:
> t = { ["keys can contain more than one word"] = "as a string can contain any
characters" }
> t["another string"] = 99
Cu to bng trn (Mixed table constructors)
Bn khng b gii hn trong vic dng cc cu to bng nh danh sch c lit k
tun t hay cc t in, bn c th trn c hai li, v d,
> t = { 2,4,6, language="Lua", version="5.1" }
y chng ta c 1 mng cc s, sau l mt vi gi tr t in. Chng ta c th

dng cc hm bng trong th vin Lua xut ra ni dung ca bng.


> for k,v in pairs(t) do print(k,v) end
12
version 5.1
36
language Lua
24
> for i,v in ipairs(t) do print(i,v) end
12
24
36
Ch s khc nhau: ipairs() ch xut ni dung lit k dng s theo th t tng dn,
cn pairs() xut tt c ni dung theo th t khng xc nh. Chng ta c th chuyn
i qua li gia 2 kiu cu trc bng
> t = { 2,4,6, language="Lua", version="5.1", 8,10,12, web="www.lua.org" }
Do tnh gng p s/chui, hy cn thn khi xut cc kha. V d:
> t = {}; t[1] = "a"; t["1"] = "b"
> for k,v in pairs(t) do print(k,v) end
1a
1b
Tt nhin, lnh type(k) s cho cc thng tin khc nhau trong c hai trng hp.
Lu v cc kha (Notes about table keys)
Lua lu tr tt c cc phn t trong cc bng theo cp kha gi tr (key-value).
Lua khng phn bit gia cc mng v cc t in. Tt c cc bng Lua thc cht
u l cc t in. Trong 1 mng, cc kha ch l cc s.
> t = { 3,6,9 } -- n ging nh...
> t = { [1]=3, [2]=6, [3]=9 } -- ging nh...
> t = {} t[1]=3 t[2]=6 t[3]=9
Cc kha l cc tham vn (Keys are references)

Ch rng cc kha l cc tham vn n cc i tng, v vy bn phi dng cng


tham vn a kha tng ng vo bng. Bn c th s dng bt c i tng
Lua no lm 1 kha ca 1 bng. Chng ta c th biu din cc kha l cc tham
vn n cc i tng qua vic dng 1 bng nh 1 kha:
> a = { [{1,2,3}]="yadda" } -- xy dng bng trong phn t c 1 kha bng
> table.foreach(a,print) -- hin th ni dung bng: cp kha gi tr
table: 0035BBC8 yadda
> = a[{1,2,3}] -- hin th gi tr phn t
nil
Lnh trn khng thi hnh v khi chng ta th ly li gi tr ca a[{1,2,3}] chng ta
khng xy dng mt bng khc, v d bng m chng ta dng nh 1 kha trong
cu to bng khng ging nh bng m chng ta dng nhn gi tr. Nu chng
ta dng cng bng trong c 2 trng hp th mi vic s din ra sung s:
> tablekey = {1,2,3} -- to 1 bng vi 1 bin i din n
> a = { [tablekey]="yadda" } -- to 1 bng dng bng nh l 1 kha
> table.foreach(a,print) -- hin th cc phn t mng
table: 0035F2F0 yadda
> = a[tablekey] -- nhn 1 gi tr t bng
yadda
> print(tablekey) -- gi tr bng cn ging vi kha kha trn
table: 0035F2F0
Cc chui l cc tham vn (Strings as references)
Chng ta phi tham chiu cng mt chui khi nhn v t gi tr, nu hng cc
kha dng chui s khng hot ng! V vy bn phi tham vn 1 chui vi gi tr
cng vi gi tr tham chiu.
> t = { apple=5 }
> a = "apple"
> b = "apple"
> print(t.apple, t[a], t) -- tt c cng gi tr v ch c 1 "apple"!
555
Gn nh mi th u l kha (Almost anything as a key)
Chng ta c th s dng gn nh mi i tng Lua (nh y l 1 hm) lm

kha:
> t = { [function(x) print(x) end] = "foo" }
> for key,value in pairs(t) do key(value) end
foo
1 Hm nhn 1 tham s khi in ra s cho gi tr "foo". Chng ta lp duyt qua bng
thc hin kha key (hm) v truyn cho n gi tr ca hm in ra c "foo".
Bi vit v cc bng (tt)
Th vin bng (The table library)
Ch : Hu ht cc hm trong th vin bng gi thit rng bng din cho 1
mng hoc 1 danh sch. i vi cc hm ny, khi ni v di ca 1 bng c
ngha l kt qu t ton t di bng (nh ton t #).
table.concat(table [, sep [, i [, j]]])
Ni cc phn t ca 1 bng li thnh 1 chui. Mi phn t u phi gng p c
thnh chui. C th to 1 phn cch gia cc phn t c ni. 1 phm vi c th
c ch r trong bng bt u ti phn t th i v kt thc ti phn t th j..
> = table.concat({ 1, 2, "three", 4, "five" })
12three4five
> = table.concat({ 1, 2, "three", 4, "five" }, ", ")
1, 2, three, 4, five
> = table.concat({ 1, 2, "three", 4, "five" }, ", ", 2)
2, three, 4, five
> = table.concat({ 1, 2, "three", 4, "five" }, ", ", 2, 4)
2, three, 4
concat s khng lm c trn 1 bng cha cc bng v khng th gng p c
thnh chui.
> = table.concat({ 1,2,{} })
stdin:1: bad argument #1 to `concat' (table contains non-strings)
stack traceback: [C]: in function `concat' stdin:1: in main chunk
[C]: ?

table.foreach(table, f)
D khng cn thng dng trong phin bn 5.1 nhng n vn hu ch trong vic
xut ra 1 bng. Bn nn dng ton t pair() thay cho hm ny. Nh vi pair(),
phng php table.foreach() khng bo m tr li cc kha c lit k theo th
t.
p dng hm f cho cc phn t ca bng table truyn vo. Trn mi vng lp, hm
f c truyn cp kha gi tr ca phn t trong bng.
> table.foreach({1,"two",3}, print) - xut cp kha gi tr
11
2 two
33
> table.foreach({1,"two",3,"four"}, function(k,v) print(string.rep(v,k)) end)
1
twotwo
333
fourfourfourfour
Nu hm f tr v mt gi tr khng-rng (non-nil), vng lp s dng.
> table.foreach({1,"two",3}, function(k,v) print(k,v) return k<2 and nil end)
11
2 two
Cc bng c th cha cc phn t trn kha gi tr v th t - gi tr.
table.foreach() s hin th tt c cc phn t trong bng. ch hin th cc phn t
th t - gi tr, hy xem table.foreachi().
> t = { 1,2,"three"; pi=3.14159, banana="yellow" }
> table.foreach(t, print)
11
22
3 three
pi 3.14159
banana yellow
table.foreachi(table, f)
(Ch : hm ny khng cn thng dng trong Lua 5.1 nhng n vn c th hu

dng xut ra 1 bng. Bn nn dng ton t ipairs() thay th. Nh vi ipairs(),


phng php table.foreachi() bo m tr v cc kha c lit k theo th t v
b qua cc kha khng lit k.)
p dng hm f cho cc phn t ca bng truyn vo. Mi ln lp hm f c
truyn vo cp th t - gi tr ca phn t trong bng, ging nh table.foreach()
ngoi tr cp truyn vo l th t - gi tr ch khng phi kha gi tr. Nu hm f
tr v 1 gi tr khng-rng (non-nil) th vng lp s dng.
> t = { 1,2,"three"; pi=3.14159, banana="yellow" }
> table.foreachi(t, print)
1 12 23 three
Ch rng trong v d ch cc phn t lit k ca bng c hin th.
table.sort(table [, comp])
Sp xp cc phn t ca 1 bng theo v tr
> t = { 3,2,5,1,4 }
> table.sort(t)
> = table.concat(t, ", ") -- hin th cc gi tr c sp xp
1, 2, 3, 4, 5
Nu bng c 1 kch thc c th th ch c vng c th c sp xp, v d,
> t = { 3,2,5,1,4; n=3 } -- xy dng bng c kch thc l 3
> table.sort(t) -- sp xp s b gii hn bi kch thc
> = table.concat(t, ", ") -- ch ni trong gii hn kch thc cho trc
2, 3, 5
1 hm so snh c th c cung cp vo vic sp xp phn t ty chn. Hm so
snh phi tr v 1 gi tr lun l ch r tham s u tin c ng trc tham s th
2 trong trnh t hay khng. Mc nh l dng so snh <. V d, cc x l sau tng
t nh khi khng c hm truyn vo:
> t = { 3,2,5,1,4 }
> table.sort(t, function(a,B) return a<b end)
> = table.concat(t, ", ")
1, 2, 3, 4, 5

Chng ta c th thy nu chng ta o ngc so snh th th t trnh t cng b o


ngc.
> table.sort(t, function(a,B) return a>b end)
> = table.concat(t, ", ")
5, 4, 3, 2, 1
table.insert(table, [pos,] value)
Chn 1 gi tr c cho vo 1 bng. Nu 1 v tr c cho, th chn gi tr vo
trc phn t hin ti v tr :
> t = { 1,3,"four" }> table.insert(t, 2, "two") -- chn "two" ti v tr trc phn t 2
> = table.concat(t, ", ")
1, two, 3, four
Nu khng c v tr c ch r th chng ta gn gi tr vo cui bng:
> table.insert(t, 5) -- khng c v tr a vo nn gn vo cui
> = table.concat(t, ", ")
1, two, 3, four, 5
Khi 1 bng c 1 phn t c chn vo th c kch thc bng v th t phn t
c cp nht:
> t = { 1,"two",3 } -- to 1 bng
> = # t -- tm kch thc hin ti 3
> table.foreach(t, print) -- hin th ni dung bng
11
2 two
33
> table.insert(t, 1, "inserted") -- chn 1 phn t vo u
> = table.concat(t, ", ") -- xem chng ta c ji
inserted, 1, two, 3
> = # t -- tm kch thc
4
> table.foreach(t, print) -- th t c cp nht
1 inserted
21
3 two

43
Khi khng c v tr c ch r, phn t c chn vo cui bng theo kch thc
c tnh ton. Kch thc ca 1 bng c th c ch r v khng phn nh s
lng phn t, v d,
> t = { 1,"two",3; n=10 } -- to 1 bng vi kch thc cho trc
> table.insert(t, "end") -- chn m khng cho bit v tr
> table.foreach(t, print) -- hin th ni dung bng
11
2 two
33
11 end
n 11
table.remove(table [, pos])
Loi b 1 phn t khi bng. Nu 1 v tr uc ch r, phn t ti v tr s b loi
b. Cc phn t cn li c sp xp li 1 cch tun t v kch thc bng c
cp nht phn nh s thay i. Phn t b loi b c tr v qua hm ny. V d,
> t = { 1,"two",3,"four" } -- to 1 bng
> = # t -- tm kch thc
4
> table.foreach(t, print) -- Xem cc phn t
11
2 two
33
4 four
> = table.remove(t,2) -- loi b phn t s 2 v hin th n
two
> table.foreach(t, print) -- hin th ni dung bng c cp nht
11
23
3 four
> = # t -- tm kch thc
3
Nu khng c v tr c a vo th loi b phn t cui cng trong bng c
ch r qua kch thc bng. V d,

> t = { 1,"two","three" }
> = # t -- tm kch thc bng ( loi b)
3
> table.foreach(t, print) -- hin th ni dung
11
2 two
3 three
> = table.remove(t) -- loi b phn t ti v tr n
three
> table.foreach(t, print) -- hin th ni dung cp nht
11
2 two
> = # t -- hin th kch thc mi
2
Nu kch thc bng khng tng ng s lng phn t th khng c g b loi
b, v d ,
> t = {1,2,3}
> table.setn(t,10) -- t kch thc
> table.foreach(t, print) -- th hin ni dung bng, ch kch thc n c lu
tr ni ti
11
22
33
> = # t -- tm kch thc
10
> = table.remove(t) -- Loi b phn t cui
nil
> = # t -- tm kch thc cp nht
9
> table.foreach(t, print) -- th hin cc phn t
11
22
33
Ch rng table.remove ch lm vic vi cc lit k dng s. i vi cc t in,
bn c th ch cn khng t cc mc bng vi tablevariable["index"] = nil;

Capture trong lua


C ch capture cho php tch cc chui thnh tng chui thnh phn cho
ph hp vi m hnh s dng. Bn xc nh mt capture bng vn bn cho cc
phn ca m hnh m bn mun capture gia du ngoc n ( ). Khi mt m hnh
c captures, hm string.match s tr v tng gi tr capture c cc kt qu
ring bit, n ph v mt chui thnh cc chui yu cu sau khi capture.
VD1: pair = "name = Anna"
key, value = string.match(pair, "(%a+)%s*=%s*(%a+)")
print(key, value) --> name Anna
Kiu %a+ c trng cho chui k t khng rng ( k t space coi nh
rng). Kiu %s* c trng cho chui k t c th rng hoc chui space ( k t
space coi nh rng). v d trn chui ban u theo th t l: chui k t, chui
khong cch, k t =, chui khong cch, chui k t khc. C hai chui k t
c kiu c bao bc bi cc du ngoc n, do chng s c capture nu
thy trng nhau.
VD2: date = "Today is 17/7/1990"
d, m, y = string.match(date, "(%d+)/(%d+)/(%d+)")
print(d, m, y) --> 17 7 1990
Chng ti c th s dng nhng capture trong mu ring ca mnh. Trong
mu, mt mc nh `% d", trong d l mt s n khp vi duy nht mt bn sao
ca capture d-th. Nh l mt s dng in hnh, gi s bn mun tm kim bn
trong mt chui, l mt chui con trong cp ngoc n hoc kp. Bn c th th
mt mu nh `[" "] .- [" "]", l mt trch dn tip theo bt c iu g theo sau
quote khc; nhng bn s c vn vi cc chui nh th no ?? n l tt c phi
khng ??. gii quyt vn ny, bn c th capture quote u tin v s dng
n xc nh th hai:
VD3: s = [[then he said: "it's all right"!]]
q, quotedPart = string.match(s, "([\"'])(.-)%1")
print(quotedPart) --> it's all right
print(q) --> "

Cch s dng th 3 ca capture gi tr l thay th chui ca gsub. Nh trong mu


qu trnh thay th chui phi cha mc nh %d, khi n c thay i c
cc capture tng ng khi thay th c thc hin.

You might also like