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

3 示例

參考

1、Lua 教程–runoob

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章