永遠(yuǎn)的hello,world
!/usr/bin/lua
print("Hello World")
--單行注釋
--[[
多行注釋
--]]
數(shù)據(jù)類型
nil這個(gè)最簡單湿弦,只有值nil屬于該類捉邢,表示一個(gè)無效值(在條件表達(dá)式中相當(dāng)于false)。
boolean包含兩個(gè)值:false和true。
number表示雙精度類型的實(shí)浮點(diǎn)數(shù)
string字符串由一對(duì)雙引號(hào)或單引號(hào)來表示
function由 C 或 Lua 編寫的函數(shù)
userdata表示任意存儲(chǔ)在變量中的C數(shù)據(jù)結(jié)構(gòu)
thread表示執(zhí)行的獨(dú)立線路牙甫,用于執(zhí)行協(xié)同程序
tableLua 中的表(table)其實(shí)是一個(gè)"關(guān)聯(lián)數(shù)組"(associative arrays)狠裹,數(shù)組的索引可以是數(shù)字或者是字符串。在 Lua 里扛施,table 的創(chuàng)建是通過"構(gòu)造表達(dá)式"來完成偏陪,最簡單構(gòu)造表達(dá)式是{},用來創(chuàng)建一個(gè)空表煮嫌。
用type函數(shù)測(cè)試給定變量或者值的類型笛谦,比如type(3) type("123")
注:nil 作比較時(shí)應(yīng)該加上雙引號(hào)?":在對(duì)一個(gè)數(shù)字字符串上進(jìn)行算術(shù)操作時(shí),Lua 會(huì)嘗試將這個(gè)數(shù)字字符串轉(zhuǎn)成一個(gè)數(shù)字:使用 # 來計(jì)算字符串的長度昌阿,在 Lua 中饥脑,函數(shù)是被看作是"第一類值(First-Class Value)"恳邀,函數(shù)可以存在變量里:function 可以以匿名函數(shù)(anonymous function)的方式通過參數(shù)傳遞:
變量
Lua 變量有三種類型:全局變量、局部變量灶轰、表中的域谣沸。
Lua 中的變量全是全局變量,那怕是語句塊或是函數(shù)里笋颤,除非用 local 顯式聲明為局部變量乳附。
局部變量的作用域?yàn)閺穆暶魑恢瞄_始到所在語句塊結(jié)束。
變量的默認(rèn)值均為 nil伴澄。
循環(huán)
while 循環(huán)在條件為 true 時(shí)赋除,讓程序重復(fù)地執(zhí)行某些語句。執(zhí)行語句前會(huì)先檢查條件是否為 true非凌。
for 循環(huán)重復(fù)執(zhí)行指定語句举农,重復(fù)次數(shù)可在 for 語句中控制。
report...until重復(fù)執(zhí)行循環(huán)敞嗡,直到 指定的條件為真時(shí)為止
循環(huán)嵌套可以在循環(huán)內(nèi)嵌套一個(gè)或多個(gè)循環(huán)語句(while do ... end;for ... do ... end;repeat ... until;)
break 語句退出當(dāng)前循環(huán)或語句颁糟,并開始腳本執(zhí)行緊接著的語句。
舉例
while循環(huán)
a=10
while( a < 20 )
do
??? print("a 的值為:", a)
???? a = a+1
end
for循環(huán)
for var=exp1,exp2,exp3
do
? ? <執(zhí)行體>?
end?
注:var 從 exp1 變化到 exp2喉悴,每次變化以 exp3 為步長遞增 var棱貌,并執(zhí)行一次?"執(zhí)行體"。exp3 是可選的箕肃,如果不指定婚脱,默認(rèn)為1。exp1突雪,exp2都會(huì)執(zhí)行起惕。
function f(x)
? ? print("function")?
? ? return x*2?
end
for i=1,f(5)
do
??? print(i)?
end?
泛型for循環(huán)
a = {"one", "two", "three"}
for i, v in ipairs(a)
do???
??? print(i, v)
end
流程控制
if 表達(dá)式
then
--為真時(shí)執(zhí)行
else?
--為假時(shí)執(zhí)行
end
if?
then
--為真時(shí)執(zhí)行
elseif
then
--為真時(shí)執(zhí)行
else
--為假時(shí)執(zhí)行
函數(shù)
舉例
function max(tab)
? ? local num = 0
? ? local index = 0
? ? for k,v in ipairs(tab) do
? ? ? ? if v > num then
? ? ? ? ? ? num = v
? ? ? ? ? ? index = k
? ? ? ? end
? ? end? ?
? ? return num,index
end
num={1,5,7,2,4,3,6}
print("num=",num)
max_num,index = max(num)
print("max_num=",max_num)
print("max_index=",index)
運(yùn)算符
與其他語言大致一樣部分不同如下
~=? 在 lua 中表示不等于
^ 在 lua 表示乘冪? 如10^2 為100
邏輯與或非? and or not
..? 連接兩個(gè)字符串
# 求字符串的長度
運(yùn)算符優(yōu)先級(jí)
^??? not ?? - ?? (unary)??? *? ? ? / ?? +? ? ? -?? ..??? <? ? ? >? ? ? <=? ? >=? ? ~=? ? ==??? and??? or
除了^和..外所有的二元運(yùn)算符都是左連接的。
字符串
Lua 語言中字符串可以使用以下三種方式來表示:
單引號(hào)間的一串字符咏删。
雙引號(hào)間的一串字符惹想。
[[和]]間的一串字符。
舉例
#!/usr/bin/lua
name = "HeWeiWei"
--全部轉(zhuǎn)大寫
print(string.upper(name))
--全部轉(zhuǎn)小寫
name1 = string.lower(name)
print(name1)
--替換name1中wei為wen督函,替換2次 返回替換次數(shù)
print(string.gsub(name1,"wei","wen",3))
--在name字符串中查找"Wei"嘀粱,從第二個(gè)字符開始查找,返回第一個(gè)查找到"Wei"的起始位置
print(string.find(name,"Wei",2))
--反轉(zhuǎn)
print(string.reverse(name))
--相當(dāng)于c的sprintf
words = name..string.format(" age is %d",18)
print(words)
--求長度
print(string.len(words))
--
word_tab = string.gmatch(words,"%a+")
for v in word_tab do
? ? print(v)
end
運(yùn)行如下
[heweiwei@CentOS7 lua]$ lua string.lua
HEWEIWEI
heweiwei
hewenwen 2
3 5
ieWieWeH
HeWeiWei age is 18
18
HeWeiWei
age
is