全域變數不需要宣告,給一個變量賦值後即建立了這個全域變數,而全域變數未初始化得到的值是 nil
print(b) --> nil
b = 1
print(b) --> 1
如果你想删除一個全域變數,只需要將變數賦值 nil
b = nil
保留字
and break do else elseif
end false for function if
in local nil not or
repeat return then true until
while
變數是大小寫有區分,不要數字開頭
單行註解
--這是單行註解
多行註解
--[[
這是多行註解
這是多行註解
這是多行註解
--]]
Lua 中有 6 個基本類型分別為:nil、boolean、number、string、function、table
print(type("Hello world")) --> string
print(type(10.4*3)) --> number
print(type(print)) --> function
print(type(type)) --> function
print(type(true)) --> boolean
print(type(nil)) --> nil
print(type(type(X))) --> string
print({}) --> table
變數可隨時切換型態
print(type(a)) --> nil (未初始化)
a = 10
print(type(a)) --> number
a = "a string!!"
print(type(a)) --> string
a = print
a(type(a)) --> function
Booleans - false 和 nil 為假,其它值為真,所以 Lua 中的 0 與空字串都為真
Numbers - 數值呈現方式 4、0.4、4.57e-3、0.3e12、5e+20
Strings - 可用單引號與雙引號與多行字串[[...]]表示如 "test"、'test'、[[test]]
數值字串轉換
print("11"+1) --> 12 (number)
print("11"..1) --> 111 (string)
print(tonumber("11")) --> 11 (number)
print(tostring(11)) --> 11 (string)
Functions - 可做參數與函示返回值,在函示裡可以做動態生成的函示(安全運行環境的隐藏函数,如下)
function outside()
function inside() print("inside called") end -- 動態生成隱藏函數
inside() -- outside 函示外部環境不能呼叫 outside 函示內部 inside 函示,因此稱為安全環境
end
Tables -
days = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}
days[2] --> Monday
a = {x=0, y=0} --> 意同 a = {}; a.x=0; a.y=0 或 a = {["x"]=0, ["y"]=0}
a.x = nil --移除 a.x
--在構造函数中域分隔符逗号(",")可以用分號(";")替代,通常我們使用分號来分割不同類型的表元素。
local a = {x=10, y=45; "one", "two", "three"}
一元運算符:- (負值)
二元運算符:+ - * / ^ (次方)
關係運算符:< > <= >= == ~= (不等於)
邏輯運算符:and or not
a and b -- 如果 a 為 false,則返回 a ,否則返回 b
a or b -- 如果 a 為 true,則返回 a,否則返回 b
★如果為 false 或者 nil 則给 x 赋初始值 v:
x = x or v --意同 if not x then x = v end
and 的優先级比 or 高。
lua 模擬三元運算 (a and b) or c
not 的结果只返回 false 或者 true
優先级高低
^
not - (unary)
* /
+ -
..
< > <= >= ~= ==
and
or
優先级範例
a+i < b/2+1 --> (a+i) < ((b/2)+1)
5+x^2*8 --> 5+((x^2)*8)
a < y and y <= z --> (a < y) and (y <= z)
-x^2 --> -(x^2)
x^y^z --> x^(y^z)
多參數設定
a, b = 10, 2 --> a=10; b=2
x, y = y, x -- x, y 交換值
a[i], a[j] = a[j], a[i] -- 'a[i]', 'a[i]' 交換值
a, b, c = 0, 1
print(a,b,c) --> 0 1 nil
a, b = a+1, b+1, b+2 -- b+2 會被忽略
print(a,b) --> 1 2
a, b, c = 0
print(a,b,c) --> 0 nil nil
a, b = f() --> f return 兩個值如 function f() return 1,2 end
區域變數
使用local建立一個區域變數,與全域變數不同,區域變數只在被宣告的程式區塊內有效。
應該盡可能使用區域變數,有兩個好處:
1. 避免命名衝突
2. 訪問區域變數的速度比全域變數更快
x = 10
local i = 1
if i > 20 then
local x -- 此 x 為區域變數,存活範圍 then - else 之間
x = 20
print(x + 2) --> 22
else
print(x) --> 10 此 x 為全域變數
end
條件式
if conditions then
then-part
end
if conditions then
then-part
else
else-part
end
if conditions then
then-part
elseif conditions then
elseif-part
.. --->多個 elseif
else
else-part
end
while condition do
statements
end
repeat
statements
until conditions
for var=exp1,exp2,exp3 do
loop-part
end
for 將用 exp3 作為 step 從 exp1(初始值)到 exp2(终止值),執行 loop-part。其中 exp3 可以省略,預設 step = 1。exp1, exp2, exp3 只會被計算一次,在循環前,且為區域變數
for i=10,1,-1 do -- exp3 為 -1 表示每次迴圈 i-1
print(i)
end
跳出迴圈
for i=10,1,-1 do
if i == 5 then break end
end
table 表鍵值輸出
-- print all values of array 'a' 印出 table 所有值
for i,v in ipairs(a) do print(v) end
-- print all keys of table 't' 印出 table 所有鍵
for k in pairs(t) do print(k) end
當函數只有一個參數並且這個參數是字串或者表的时候,()可有可無
print "Hello World" --> print("Hello World")
dofile 'a.lua' --> dofile ('a.lua')
print [[a multi-line
message]] --> print([[a multi-line
message]])
f{x=10, y=20} --> f({x=10, y=20})
type{} --> type({})
多返回值
s, e = string.find("hello Lua users", "Lua")
print(s, e) --> 7 9
function foo0 () end -- 沒返回
function foo1 () return 'a' end -- 返回1個值
function foo2 () return 'a','b' end -- 返回2個值
x,y = foo2() -- x='a', y='b'
x = foo2() -- x='a', 'b' 被忽略
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 被忽略
print(foo0()) -->
print(foo1()) --> a
print(foo2()) --> a b
print(foo2(), 1) --> a 1
print(foo2() .. "x") --> ax
a = {foo0()} -- a = {} (空表格)
a = {foo1()} -- a = {'a'}
a = {foo2()} -- a = {'a', 'b'}
a = {foo0(), foo2(), 4} -- a[1] = nil, a[2] = 'a', a[3] = 4
用括號強制函數返回一個值
print((foo0())) --> nil
print((foo1())) --> a
print((foo2())) --> a
多參數函示
arg 為多餘參數且為 table
function g (a, b, ...)
print(a,b,arg)
end
g(3) --> a=3, b=nil, arg={n=0}
g(3, 4) --> a=3, b=4, arg={n=0}
g(3, 4, 5, 8) --> a=3, b=4, arg={5, 8; n=2}
如果我們只想要string.find返回的第二個值。一個典型的方法是使用啞元(dummy variable,底線)
local _, x = string.find(s, p)
函示宣告有兩種方式
function foo (x) return 2*x end
foo = function (x) return 2*x end
下面例子中包含在 sortbygrade 函式内部的 sort 中的匿名函数可以訪問 sortbygrade 的參數 grades,在匿名函式内部 grades 不是全域變數也不是區域變數,我們稱做為外部的區域變數( external local variable )或者 upvalue。
function sortbygrade (names, grades)
table.sort(names, function (n1, n2)
return grades[n1] > grades[n2] -- compare the grades
end)
end
table 表中的函示宣告
Lib = {}
Lib.foo = function (x,y) return x + y end
Lib.goo = function (x,y) return x - y end
Lib = {
foo = function (x,y) return x + y end,
goo = function (x,y) return x - y end
}
Lib = {}
function Lib.foo (x,y)
return x + y
end
function Lib.goo (x,y)
return x - y
end
遞迴函示宣告
如下上面這種方式導致 Lua 編譯時遇到 fact(n-1) 並不知道它是區域變數 fact,Lua 會去查找是否有這樣的全局函示 fact。為了解决這個問題我們必須在定義函式以前先宣告 fact
local fact = function (n)
if n == 0 then
return 1
else
return n*fact(n-1) --> 編譯器會認為是全域函示
end
end
--改寫
local fact
fact = function (n)
if n == 0 then
return 1
else
return n*fact(n-1)
end
end
函式返回值可以是運算式
function myReturn()
return x+y-z
end
_G 是 lua 的環境變數,大家可以
print_r(_G) 看看,只要你的main.lua裡有設置全域變數,都會出現在_G全域表裡。或許可以找到官方未公開的函示:)
了解 Lua 程式基礎後可以進入
Corona SDK 精選 API 快速入門 階段