介紹
1. 定義:
Lua是一種輕量小巧的腳本語言,用標準C語言編寫並以源代碼形式開放,其設計目的是爲了嵌入應用程序中,從而爲應用程序提供靈活的擴展和定製功能。
2. 特性:
- 輕量級: 它用標準C語言編寫並以源代碼形式開放,編譯後僅僅一百餘K,可以很方便的嵌入別的程序裏。
- 可擴展: Lua提供了非常易於使用的擴展接口和機制:由宿主語言(通常是C或C++)提供這些功能,Lua可以使用它們,就像是本來就內置的功能一樣。
- 支持面向過程(procedure-oriented)編程和函數式編程(functional programming);
- 自動內存管理;只提供了一種通用類型的表(table),用它可以實現數組,哈希表,集合,對象;
3. 應用場景
遊戲開發、獨立應用腳本、Web應用腳本、擴展和數據庫插件如:MySQL Proxy 和 MySQL WorkBench等。
準備
- Windows環境安裝
直接下載安裝包:http://static.runoob.com/download/LuaForWindows_v5.1.4-46.exe - 從命令行通過lua -i或lua啓用Lua。
- 第一個Lua程序
> print("Hello World!")
Hello World!
- 單行註釋
--
- 多行註釋:
--[[
]]--
數據類型和變量
Lua有8個基本類型:nil、boolean、number、string、table、function、thread和userdata
1. nil(空)
Note:判斷類型是否爲nil時,需要加引號
> print(type(x))
nil
> print(type(x)==nil)
false
> print(type(x)=="nil")
true
這是因爲type(type(X))==string
2. number
默認是double類型
3. string
- “”、”表示一個字符串,[[]]表示一塊字符串
> poem = [[
>> I
>> Love
>> You
>> ]]
> print(poem)
I
Love
You
- 可以用數字字符串進行算數操作
> print("1" + 1)
2
- 字符串用..連接
> print("I".." Love".." You")
I Love You
- 用#放在字符串前,計算字符串長度
> len = "I Love Lua!"
> print(#len)
11
> print(#"I Love Lua!")
11
- 替換,num忽略時全部替換
string.gsub(mainString,findString,replaceString,num)
- 匹配模式
. 任何字符、%a 任何字母、%c 任何控制符、%d 任何數字、%l 任何小寫字母、%p 任何標點、%s 空白字符、%u 大寫字母、%w 任何字母/數字,%後大寫代表與任何非此類匹配,比如%A 任何非字母。後面跟:* 零或多個(儘可能長)、+ 一或多個(儘可能長)、- 零活多個(儘可能短)、? 零或一個
4. table
- 索引默認從1開始
> tb = {"1", "2"}
> print(tb[1])
1
- 字典類型的Table
> a = {}
> a["key"] = "value"
> key = 10
> a[key] = 22
> for k, v in pairs(a) do
>> print(k..":"..v)
>> end
key:value
10:22
5. userdata
將C/C++創建的任意數據類型,比如struct和指針,存儲到Lua變量中調用。
6. 變量
- 變量類型
- 全局變量,沒有特別說明的變量都是全局變量,默認值爲nil
- 局部變量,用local顯式聲明的變量是局部變量,作用域爲聲明到語句塊結束,多使用局部變量有兩個好處:訪問快;避免命名衝突
- 表中的域
- 賦值
Lua可以對多個變量同時賦值,變量列表和值列表的各個元素用逗號分開,當變量個數和值個數不一致時,少補nil,多忽略
> a, b, c = 1, 2, 3
> print(a, b, c)
1 2 3
> x, y = y, x -- swap 'x' for 'y'
> a, b = f() -- 將函數調用返回給變量
- 索引
索引表中的元素可以用[],也可以用.,例如t[i]、t.i
流程控制
1. 循環
- while,wiile do … end
- for,for do … end
- repeat … until
- 嵌套
2. 分支判斷
- if
- if … else
- 嵌套
Note:Lua中false和nil爲假,true和非nil爲真,0爲真!
函數
1.在Lua中,function被看作是First-Class Value,可以存在變量中。
> function count(n)
> function count(n)
>> n = n + 1
>> return n
>> end
> count1 = count
> print(count(1))
2
> print(count1(1))
2
2.匿名函數
> print((function() return 1 end)())
1
3. 函數作爲參數
function max(a, b)
if (a > b) then
return a
else
return b
end
end
function count_grade(grade1, grade2, max)
return max(grade1, grade2)
end
print(count_grade(20, 30, max))
運行結果:
30
4. 多返回值
在返回值時用,隔開即可
5. 可變參數
用…表示可變參數,如果有固定參數,放在可變參數前面
function average(...)
result = 0
local arg={...}
for i,v in ipairs(arg) do
result = result + v
end
print("總共傳入 " .. select("#",...) .. " 個數")
return result/select("#",...)
end
print("平均值爲",average(10,5,3,4,5,6))
運行結果:
總共傳入 6 個數
平均值爲 5.5
運算符
1. 算數運算符
+、-、*、/、%、^、-
2. 關係運算符
==、~=(不等於)、>、<、>=、<=
3. 邏輯運算符
and、or、not
4. 其它運算符
..(連接字符串)、#(返回字符串或表的長度)
thread
- 在Lua裏,最主要的線程是協同程序(coroutine)。它跟線程(thread)差不多,擁有自己獨立的棧、局部變量和指令指針,可以跟其他協同程序共享全局變量和其他大部分東西。
- 線程跟協程的區別:線程可以同時多個運行,而協程任意時刻只能運行一個,並且處於運行狀態的協程只有被掛起(suspend)時纔會暫停。
模塊和包
模塊類似封裝庫,Lua的模塊是由變量、函數等組成的table。通過require加載模塊,例如
require "module"
或
local m = require("module")
require 用於搜索 Lua 文件的路徑是存放在全局變量 package.path 中,當 Lua 啓動後,會以環境變量 LUA_PATH 的值來初始這個環境變量。如果沒有LUA_PATH這個環境變量,也可以自定義設置,在當前用戶根目錄下打開.profile文件(沒有則創建,打開 .bashrc 文件也可以),例如把 “~/lua/” 路徑加入 LUA_PATH 環境變量裏:
#LUA_PATH
export LUA_PATH="~/lua/?.lua;;"
接着,更新環境變量參數,使之立即生效。
source ~/.profile
[1] http://www.runoob.com/lua/lua-variables.html
[2] https://yq.aliyun.com/wenzhang/show_43449