摘自《Programming in LUA》,著重選一些特點(diǎn)。PS:誰(shuí)能提供一本實(shí)例教程?
全局變量不需要聲明,給一個(gè)變量賦值后即創(chuàng)建了這個(gè)全局變量,訪問(wèn)一個(gè)沒(méi)有初
始化的全局變量也不會(huì)出錯(cuò),只不過(guò)得到的結(jié)果是:nil.
-e:直接將命令傳入Lua
prompt> lua -e "print(math.sin(12))" --> -0.53657291800043
-l:加載一個(gè)文件.
-i:進(jìn)入交互模式.
第2 章 類型和值
Lua 是動(dòng)態(tài)類型語(yǔ)言,變量不要類型定義。Lua 中有8 個(gè)基本類型分別為:nil、boolean、
number、string、userdata、function、thread 和table。函數(shù)type 可以測(cè)試給定變量或者值
的類型。
兩個(gè)取值false 和true。但要注意Lua 中所有的值都可以作為條件。在控制結(jié)構(gòu)的條
件中除了false 和nil 為假,其他值都為真。所以Lua 認(rèn)為0 和空串都是真。
第3 章 表達(dá)式
a and b -- 如果a為false,則返回a,否則返回b
a or b -- 如果a為true,則返回a,否則返回b
一個(gè)很實(shí)用的技巧:如果x 為false 或者nil 則給x 賦初始值v
x = x or v
等價(jià)于
if not x then
x = v
end
and 的優(yōu)先級(jí)比or 高。
not 的結(jié)果一直返回false 或者true
print(not nil) --> true
邏輯運(yùn)算符認(rèn)為false 和nil 是假(false),其他為真,0 也是true.
and 和or 的運(yùn)算結(jié)果不是true 和false,而是和它的兩個(gè)操作數(shù)相關(guān)。
a and b -- 如果a為false,則返回a,否則返回b
a or b -- 如果a為true,則返回a,否則返回b
例如:
print(4 and 5) --> 5
print(nil and 13) --> nil
print(false and 13) --> false
print(4 or 5) --> 4
print(false or 5) --> 5
一個(gè)很實(shí)用的技巧:如果x 為false 或者nil 則給x 賦初始值v
x = x or v
等價(jià)于
if not x then
x = v
end
and 的優(yōu)先級(jí)比or 高。
C 語(yǔ)言中的三元運(yùn)算符
a ? b : c
在Lua 中可以這樣實(shí)現(xiàn):
(a and b) or c
not 的結(jié)果一直返回false 或者true
print(not nil) --> true
print(not false) --> true
print(not 0) --> false
print(not not nil) --> false
連連接接運(yùn)運(yùn)算算符符
.. --兩個(gè)點(diǎn)
字符串連接,如果操作數(shù)為數(shù)字,Lua 將數(shù)字轉(zhuǎn)成字符串。
print("Hello " .. "World") --> Hello World
print(0 .. 1) --> 01
w = {x=0, y=0, label="console"}
x = {sin(0), sin(1), sin(2)}
w[1] = "another field"
x.f = w
print(w["x"]) --> 0
print(w[1]) --> another field
print(x.f[1]) --> another field
w.x = nil -- remove field "x"
在構(gòu)造函數(shù)中域分隔符逗號(hào)(",")可以用分號(hào)(";")替代,通常我們使用分號(hào)用來(lái)
分割不同類型的表元素。
{x=10, y=45; "one", "two", "three"}
print(not false) --> true
print(not 0) --> false
print(not not nil) --> false
第4 章 基本語(yǔ)法
Lua 可以對(duì)多個(gè)變量同時(shí)賦值,變量列表和值列表的各個(gè)元素用逗號(hào)分開(kāi),賦值語(yǔ)
句右邊的值會(huì)依次賦給左邊的變量。
a, b = 10, 2*x <--> a=10; b=2*x
遇到賦值語(yǔ)句Lua 會(huì)先計(jì)算右邊所有的值然后再執(zhí)行賦值操作,所以我們可以這樣
進(jìn)行交換變量的值:
x, y = y, x -- swap 'x' for 'y'
a[i], a[j] = a[j], a[i] -- swap 'a[i]' for 'a[i]'
當(dāng)變量個(gè)數(shù)和值的個(gè)數(shù)不一致時(shí),Lua 會(huì)一直以變量個(gè)數(shù)為基礎(chǔ)采取以下策略:
a. 變量個(gè)數(shù)>值的個(gè)數(shù) 按變量個(gè)數(shù)補(bǔ)足nil
b. 變量個(gè)數(shù)<值的個(gè)數(shù) 多余的值會(huì)被忽略
例如:
a, b, c = 0, 1
print(a,b,c) --> 0 1 nil
a, b = a+1, b+1, b+2 -- value of b+2 is ignored
print(a,b) --> 1 2
a, b, c = 0
print(a,b,c) --> 0 nil nil
多值賦值經(jīng)常用來(lái)交換變量,或?qū)⒑瘮?shù)調(diào)用返回給變量:
a, b = f()
f()返回兩個(gè)值,第一個(gè)賦給a,第二個(gè)賦給b。
我們給block 劃定一個(gè)明確的界限:do..end 內(nèi)的部分。
控制結(jié)構(gòu)的條件表達(dá)式結(jié)果可以是任何值,Lua 認(rèn)為false 和nil 為假,其他值為真。
repeat-until 語(yǔ)句:
repeat
statements;
until conditions;
有時(shí)候?yàn)榱苏{(diào)試或者其他目的需要在block 的中間使用return 或者break,可以顯式
的使用do..end 來(lái)實(shí)現(xiàn):
function foo ()
return --<< SYNTAX ERROR
-- 'return' is the last statement in the next block
do return end -- OK
... -- statements not reached
end
調(diào)用函數(shù)的時(shí)候,如果參數(shù)列表為空,必須使用()表明是函數(shù)調(diào)用。
print(8*9, 9/8)
a = math.sin(3) + math.cos(10)
print(os.date())
上述規(guī)則有一個(gè)例外,當(dāng)函數(shù)只有一個(gè)參數(shù)并且這個(gè)參數(shù)是字符串或者表構(gòu)造的時(shí)
候,()是可選的:
print "Hello World" <--> print("Hello World")
dofile 'a.lua' <--> dofile ('a.lua')
print [[a multi-line <--> print([[a multi-line
message]] message]])
f{x=10, y=20} <--> f({x=10, y=20})
type{} <--> type({})
Lua 函數(shù)實(shí)參和形參的匹配與賦值語(yǔ)句類似,多余部分被忽略,缺少部分用nil 補(bǔ)足。
function f(a, b) return a or b end
CALL PARAMETERS
f(3) a=3, b=nil
f(3, 4) a=3, b=4
f(3, 4, 5) a=3, b=4 (5 is discarded)
Lua 函數(shù)中,在return 后列出要返回的值得列表即可返回多值,如:
function maximum (a)
local mi = 1 -- maximum index
local m = a[mi] -- maximum value
for i,val in ipairs(a) do
if val > m then
mi = i
m = val
end
end
return m, mi
end
print(maximum({8,10,23,12,5})) --> 23 3
Lua 總是調(diào)整函數(shù)返回值的個(gè)數(shù)去適用調(diào)用環(huán)境,當(dāng)作為一個(gè)語(yǔ)句調(diào)用函數(shù)時(shí),所
有返回值被忽略。假設(shè)有如下三個(gè)函數(shù):
function foo0 () end -- returns no results
function foo1 () return 'a' end -- returns 1 result
function foo2 () return 'a','b' end -- returns 2 results
第一,當(dāng)作為表達(dá)式調(diào)用函數(shù)時(shí),有以下幾種情況:
1. 當(dāng)調(diào)用作為表達(dá)式最后一個(gè)參數(shù)或者僅有一個(gè)參數(shù)時(shí),根據(jù)變量個(gè)數(shù)函數(shù)盡可能
多地返回多個(gè)值,不足補(bǔ)nil,超出舍去。
2. 其他情況下,函數(shù)調(diào)用僅返回第一個(gè)值(如果沒(méi)有返回值為nil)
x,y = foo2() -- x='a', y='b'
x = foo2() -- x='a', 'b' is discarded
x,y,z = 10,foo2() -- x=10, y='a', z='b'
x,y = foo0() -- x=nil, y=nil
x,y = foo1() -- x='a', y=nil
x,y,z = foo2() -- x='a', y='b', z=nil
x,y = foo2(), 20 -- x='a', y=20
x,y = foo0(), 20, 30 -- x='nil', y=20, 30 is discarded
第二,函數(shù)調(diào)用作為函數(shù)參數(shù)被調(diào)用時(shí),和多值賦值是相同。
print(foo0()) -->
print(foo1()) --> a
print(foo2()) --> a b
print(foo2(), 1) --> a 1
print(foo2() .. "x") --> ax
第三,函數(shù)調(diào)用在表構(gòu)造函數(shù)中初始化時(shí),和多值賦值時(shí)相同。
a = {foo0()} -- a = {} (an empty table)
a = {foo1()} -- a = {'a'}
a = {foo2()} -- a = {'a', 'b'}
a = {foo0(), foo2(), 4} -- a[1] = nil, a[2] = 'a', a[3] = 4
另外,return f()這種類型的返回f()返回的所有值
function foo (i)
if i == 0 then return foo0()
elseif i == 1 then return foo1()
elseif i == 2 then return foo2()
end
end
print(foo(1)) --> a
print(foo(2)) --> a b
print(foo(0)) -- (no results)
print(foo(3)) -- (no results)
可以使用圓括號(hào)強(qiáng)制使調(diào)用返回一個(gè)值。
print((foo0())) --> nil
print((foo1())) --> a
print((foo2())) --> a