Lua--2.語法
1 簡介
Lua(魯啊) 是一門強大、快速、輕量的嵌入式腳本語言。可以作爲和C/C++執行腳本交互的語言。並且Lua的整個庫很小,Lua 5.1版本整個靜態鏈接的lua.dll才164KB,所以Lua很輕量,特別適合輕量級腳本嵌入。
2 語法
2.1 數據類型與變量
2.1.1 數據類型
8 個基本類型分別爲:nil、boolean、number、string、userdata、function、thread 和 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
2.1.2 變量
Lua 變量有三種類型:全局變量、局部變量、表中的域。
賦值語句
a = "hello" .. "world"
t.n = t.n + 1
實例
-- test.lua 文件腳本
a = 5 -- 全局變量
local b = 5 -- 局部變量
function joke()
c = 5 -- 全局變量
local d = 6 -- 局部變量
end
joke()
print(c,d) --> 5 nil
do
local a = 6 -- 局部變量
b = 6 -- 對局部變量重新賦值
print(a,b); --> 6 6
end
print(a,b) --> 5 6
2.2 表達式
2.2.1 操作符
算術運算符:+ - * / ^ (加減乘除冪)
關係運算符:< > <= >= == ~=
邏輯運算符:and or not
連接運算符:…
2.2.2 注意
有幾個操作符跟C語言不一樣的:
a ~= b 即 a 不等於 b
a ^ b 即 a 的 b 次方
a … b 將 a 和 b 作爲字符串連接
2.2.3 優先級
^
not -(負號)
* /
+ -
..
< > <= >= ~= ==
and
or
2.2.4 表的構造
最簡單的構造函數是{},用來創建一個空表。可以直接初始化數組:
days = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}
2.2.5 多重賦值和多返回值
year, month, day = 2011, 3, 12
print(year, month, day)
reutrn year, month, day -- 多返回值
a, b = f()
於是,交換兩個變量值的操作也變得非常簡單:
a, b = b, a
2.3 控制流
2.3.1 if
name = "peach"
if name == "apple" then
-- body
elseif name == "banana" then
-- body
else
-- body
end
2.3.2 for
-- 初始值, 終止值, 步長
for i=1, 10, 2 do
print(i)
end
-- 數組
for k, v in ipairs(table) do
print(k, v)
end
-- 字典
for k, v in pairs(table) do
print(k, v)
end
反向表構造實例:
revDays = {}
for i,v in ipairs(days) do
revDays[v] = i
end
2.3.3 while
while i<10 do
print(i)
i = i + 1
end
2.3.4 repeat-until
repeat
print(i)
i = i + 1
until i < 10
2.3.5 break 和 return
break 語句可用來退出當前循環(for, repeat, while),循環外部不可以使用。
return 用來從函數返回結果,當一個函數自然結束,結尾會有一個默認的return。
Lua語法要求break和return只能出現在block的結尾一句(也就是說:作爲chunk的最後一句,或者在end之前,或者else前,或者until前)
local i = 1
while a[i] do
if a[i] == v then break end
i = i + 1
end
2.4 字符串與數組
2.4.1 字符串定義
字符串或串(String)是由數字、字母、下劃線組成的一串字符。
Lua 語言中字符串可以使用以下三種方式來表示:
- 單引號間的一串字符。
- 雙引號間的一串字符。
- [[和]]間的一串字符。
string1 = "Lua"
print("\"字符串 1 是\"",string1)
string2 = 'language'
print("字符串 2 是",string2)
string3 = [["Lua 教程"]]
print("字符串 3 是",string3)
// follow is result
"字符串 1 是" Lua
字符串 2 是 language
字符串 3 是 "Lua 教程"
2.4.2 轉義字符
2.4.3 字符串操作
1、string.upper(argument):
字符串全部轉爲大寫字母。
2、string.lower(argument):
字符串全部轉爲小寫字母。
3、string.gsub(mainString,findString,replaceString,num)
在字符串中替換。
mainString 爲要操作的字符串, findString 爲被替換的字符,replaceString 要替換的字符,num 替換次數(可以忽略,則全部替換),如:
string.gsub("aaaa","a","z",3);
zzza 3
4、string.find (str, substr, [init, [end]])
在一個指定的目標字符串中搜索指定的內容(第三個參數爲索引),返回其具體位置。不存在則返回 nil。
string.find("Hello Lua user", "Lua", 1)
7 9
5、string.reverse(arg)
字符串反轉
string.reverse("Lua")
auL
6、string.format(...)
返回一個類似printf的格式化字符串
string.format("the value is:%d",4)
the value is:4
7、string.char(arg) 和 string.byte(arg[,int])
char 將整型數字轉成字符並連接, byte 轉換字符爲整數值(可以指定某個字符,默認第一個字符)。
string.char(97,98,99,100)
abcd
string.byte("ABCD",4)
68
string.byte("ABCD")
65
8、string.len(arg)
計算字符串長度。
string.len("abc")
3
9、 string.rep(string, n)
返回字符串string的n個拷貝
string.rep("abcd",2)
abcdabcd
10、..
鏈接兩個字符串
print("www.runoob.".."com")
www.runoob.com
11、string.gmatch(str, pattern)
回一個迭代器函數,每一次調用這個函數,返回一個在字符串 str 找到的下一個符合 pattern 描述的子串。如果參數 pattern 描述的字符串沒有找到,迭代函數返回nil。
for word in string.gmatch("Hello Lua user", "%a+") do print(word) end
Hello
Lua
user
12、string.match(str, pattern, init)
string.match()只尋找源字串str中的第一個配對. 參數init可選, 指定搜尋過程的起點, 默認爲1。
在成功配對時, 函數將返回配對錶達式中的所有捕獲結果; 如果沒有設置捕獲標記, 則返回整個配對字符串. 當沒有成功的配對時, 返回nil。
string.match("I have 2 questions for you.", "%d+ %a+")
2 questions
string.format("%d, %q", string.match("I have 2 questions for you.", "(%d+) (%a+)"))
2, "questions"
2.5 函數
2.5.1 定義
optional_function_scope function function_name( argument1, argument2, argument3..., argumentn)
function_body
return result_params_comma_separated
end
- optional_function_scope: 該參數是可選的制定函數是全局函數還是局部函數,未設置該參數默認爲全局函數,如果你需要設置函數爲局部函數需要使用關鍵字 local。
- function_name: 指定函數名稱。
- argument1, argument2, argument3…, argumentn: 函數參數,多個參數以逗號隔開,函數也可以不帶參數。
- function_body: 函數體,函數中需要執行的代碼語句塊。
- result_params_comma_separated: 函數返回值,Lua語言函數可以返回多個值,每個值以逗號隔開。
2.5.2 實例
--[[ 函數返回兩個值的最大值 --]]
function max(num1, num2)
if (num1 > num2) then
result = num1;
else
result = num2;
end
return result;
end
-- 調用函數
print("兩值比較最大值爲 ",max(10,4))
print("兩值比較最大值爲 ",max(5,6))
2.5.3 可變參數
Lua 函數可以接受可變數目的參數,和 C 語言類似,在函數參數列表中使用三點 … 表示函數有可變的參數。
function add(...)
local s = 0
for i, v in ipairs{...} do --> {...} 表示一個由所有變長參數構成的數組
s = s + v
end
return s
end
print(add(3,4,5,6,7)) --->25