Professional Documents
Culture Documents
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
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.
>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)
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])
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 = {}
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
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
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;