1. 程式人生 > >lua語言十分鐘

lua語言十分鐘

Lua是一門什麼語言?

小巧的指令碼語言,其設計目的是為了嵌入應用程式中,從而為應用程式提供靈活的擴充套件和定製功能。Lua由標準C編寫而成,幾乎在所有作業系統和平臺上都可以編譯,執行。

特點

  • Lua指令碼可以很容易的被C/C++ 程式碼呼叫,也可以反過來呼叫C/C++的函式。
  • Lua由標準C編寫而成,程式碼簡潔優美,幾乎在所有作業系統和平臺上都可以編譯,執行。
  • 以極小的體積和簡單的語法提供全面的功能。[一個完整的Lua直譯器不過200k,在目前所有指令碼引擎中,Lua的速度是最快的]
  • 實現與宿主語言的簡潔介面
  • 成為一個很容易嵌入其它語言中使用的語言。

特性

  • 支援面向物件程式設計
  • 輕量級
  • 可擴充套件
  • 函數語言程式設計
  • 自動記憶體管理
  • 通用型別的表–table,可實現陣列,雜湊表,集合,物件
  • 支援閉包
  • 支援多執行緒
  • 支援互動式程式設計-

用途

  • 遊戲開發,多用於遊戲指令碼開發 
  • 嵌入式開發
  • Web應用指令碼
  • 擴充套件和資料庫外掛
  • 安全系統

安裝

http://www.runoob.com/lua/lua-environment.html

學習資源

互動式

互動式程式設計 
Lua 提供了互動式程式設計模式。我們可以在命令列中輸入程式並立即檢視效果。 
Lua 互動式程式設計模式可以通過命令 lua -i 或 lua 來啟用:

$ lua 
$ Lua 5.3.0  Copyright (C) 1994-2015 Lua.org, PUC-Rio
>
  • 1
  • 2
  • 3

在命令列中,輸入以下 
> print("Hello World!") 
Hello World!


互動式學習lua入門體驗

1.執行lua檔案的方法:

$ lua HelloWorld.lua
  • 1
自己參照著入門案例,在右邊互動式終端中動手試一試!

菜鳥教程入門

基本的資料型別

-------------------------------------------------------基礎語法  --------------------------------------------------------
-- 註釋
-- 這就是單行註釋

--[[
這就是多行註釋
這就是多行註釋
--]]


--刪除變數
n = 10
print(n)
n = bil --刪除變數
print(n)

--------------------------------------------------------資料型別--------------------------------------------------------------
--Lua是動態型別語言,變數不需要型別定義,只需要為變數賦值即可。
print("資料型別: nil")
print(type(nil))

print("\n")

print("資料型別: boolean")
print(type(true))
print(type(false))

print("\n")

print("資料型別: number")
-- Lua 預設只有一種 number 型別 -- double(雙精度)型別
print(type(2.3))

print("\n")

print("資料型別: string")
--字串由一對雙引號或單引號來表示。
print(type("hello world in lua"))
--也可以用 2 個方括號 "[[]]" 來表示"一塊"字串
str = [[ 
hello
in 
world !
]]
print(str)

--計算字串長度
print("the length of str is "..#str) --使用# 來計算長度



print("\n")

print("資料型別: table")  --important
-- 不同於其他語言的陣列把 0 作為陣列的初始索引,在 Lua 裡表的預設初始索引一般以 1 開始。
tab = {key1 ="value1",key2="value2"}

for k,v in pairs(tab) do
    print(k .. "-".. v)  -- 連線符 ..
end


print("\n")
tabt = {} --空表
tabt["key3"] = "value3"

key4 = "key4"
tabt[key4] = "vlaue4"

for k,v in pairs(tabt) do
    print(k.." = "..v)
end

-- 索引
--對 table 的索引使用方括號 []。Lua 也提供了 . 操作。
print("索引 "..tabt[key4])

print("索引 "..tabt.key3)

print("\n")

print("資料型別: function")
print(type(print))


function demo()
    return "hello"
end

print(demo())


--匿名函式

function anonymous(tab,fn)
    for k,v in pairs(tab) do
        print(fn(k,v))
    end
end

anonymous(tabt,function(k,v)
    return k .."==".. v
end)


--陣列
print("\n")
arr = {1,2,3,"h"}
for i = 1,4 do
    print("陣列 "..i.." =="..arr[i])
end

print("\n多維陣列")
arrm = {}
arrm[1] = {1,2,3}
arrm[2] = {4,5,6}

for i= 1,2 do
    for j = 1,3 do
        print("多維陣列 "..arrm[i][j]) --notice
    end
end
--------------------------------------------------------Lua 變數--------------------------------------------------------------
print("\n")
print("Lua 變數")

--[[
Lua 變數有三種類型:全域性變數、區域性變數、表中的域。
Lua 中的變數全是全域性變數,那怕是語句塊或是函式裡,除非用 local 顯示宣告為區域性變數。
區域性變數的作用域為從宣告位置開始到所在語句塊結束。
變數的預設值均為 nil。


應該儘可能的使用區域性變數,有兩個好處:
1. 避免命名衝突。
2. 訪問區域性變數的速度比全域性變數更快。

--]]

a = 12
local b = 1

function area()
    b = 3
    local a = 3
    local c = 26
end

print("a is "..a)  --12
print("b is "..b)  -- 1  notice: here b is 1
print("c is "..type(c)) --nil

-- 多個變數同時賦值
-- 注意:如果要對多個變數賦值必須依次對每個變數賦值。
a,b = "hello","world"
print(a..b)



--------------------------------------------------------Lua 迴圈--------------------------------------------------------------
print("\n")
print("while迴圈")
i = 10
while(i > 0)
do
    i = i - 1
    print(i)
end

print("\n")

while (i < 7) do
    i = i + 1
    print(i)
end

print("\n")
print("for迴圈")
--[[
Lua 程式語言中 for語句有兩大類::
數值for迴圈
泛型for迴圈
--------------
Lua 程式語言中數值for迴圈語法格式:
for的三個表示式在迴圈開始前一次性求值,以後不再進行求值。
for var=exp1,exp2,exp3 do  
    <執行體>  
end  
var從exp1變化到exp2,每次變化以exp3為步長遞增var,並執行一次"執行體"。
exp3是可選的,如果不指定,預設為1。
--]]

for i=0,10 do
    print(i)
end


function f(x)
    return x*5
end

for i=1,f(5),2 do
    print(i)
end

-- 泛型for迴圈
print("泛型for迴圈")
--泛型for迴圈通過一個迭代器函式來遍歷所有值,類似java中的foreach語句。
--i是陣列索引值,v是對應索引的陣列元素值。ipairs是Lua提供的一個迭代器函式,用來迭代陣列。
arr = {1,23,4,55,1,3234,4}
for i,v in ipairs(arr) do
    print("泛型for迴圈:"..i..' '..v)

end


print("\n")
print("repeat until")

i = 10
repeat
    print(i)
    i = i -1
until(i < 0)


--------------------------------------------------------Lua 流程控制 --------------------------------------------------------
print("\n")
if(true) then   -- 注意這裡是then
    print("if contro")
end

a = 100

-- if else
if(a >100) then
    print(a+100)
else
    print(a)
end

-- if elseif else

if(a<200) then
    print("a<200")
elseif(a <100) then
    print("a<100")
else 
    print(a)
end

--------------------------------------------------------Lua 函式---------------------------------------------------------------------

--Lua函式可以返回多個結果值
-- return a,b

--可變引數
--[[
Lua函式可以接受可變數目的引數,和C語言類似在函式引數列表中使用三點(...) 表示函式有可變的引數。
Lua將函式的引數放在一個叫arg的表中,#arg 表示傳入引數的個數。
--]]


function cot(...)
    return "引數個數是 "..#arg
end 
print(cot(1,2,3,4,5))



--------------------------------------------------------Lua 運算子---------------------------------------------------------------------

-- http://www.runoob.com/lua/lua-miscellaneous-operator.html


a = 21
b = 10
c = a + b
print("Line 1 - c 的值為 ", c )
c = a - b
print("Line 2 - c 的值為 ", c )
c = a * b
print("Line 3 - c 的值為 ", c )
c = a / b
print("Line 4 - c 的值為 ", c )
c = a % b
print("Line 5 - c 的值為 ", c )
c = a^2
print("Line 6 - c 的值為 ", c )
c = -a
print("Line 7 - c 的值為 ", c )


a = true
b = false
if(a or b) then
    print(a or b)
end



--------------------------------------------------------Lua 字串---------------------------------------------------------------------


str = "hello in world! Lua loved!"
print(string.upper(str))
print(string.lower(str))
print(string.reverse(str))


--------------------------------------------------------Lua table---------------------------------------------------------------------
--[[
table 是 Lua 的一種資料結構用來幫助我們建立不同的資料型別,如:數字、字典等。
Lua table 使用關聯型陣列,你可以用任意型別的值來作陣列的索引,但這個值不能是 nil。
Lua table 是不固定大小的,你可以根據自己需要進行擴容。
Lua也是通過table來解決模組(module)、包(package)和物件(Object)的。 例如string.format表示使用"format"來索引table string。

--]]
print("\n")
print("Table 連線")
fruits = {1,2,3,4}
print("連線後",table.concat(fruits,'-'))


print("\n")
print("Table insert and remove")
table.insert(fruits,"hh")
print(fruits[5])

table.remove(fruits)  --返回table陣列部分位於pos位置的元素. 其後的元素會被前移. pos引數可選, 預設為table長度, 即從最後一個元素刪起


print("Table 排序")
table.sort(fruits)
for k,v in pairs(fruits) do
    print(k.."--"..v)
end



--------------------------------------------------------Lua 協同程式---------------------------------------------------------------------
-- Notice::協同程式在線上ide上,使用coroutine.resume()不能打印出具體值來,所以建議在本地練習!!


print("\n------------協調程式-----------------\n")
--[[
Lua 協同程式(coroutine)與執行緒比較類似:擁有獨立的堆疊,獨立的區域性變數,獨立的指令指標,同時又與其它協同程式共享全域性變數和其它大部分東西。
協同是非常強大的功能,但是用起來也很複雜。
執行緒和協同程式區別
執行緒與協同程式的主要區別在於,一個具有多個執行緒的程式可以同時執行幾個執行緒,而協同程式卻需要彼此協作的執行。
在任一指定時刻只有一個協同程式在執行,並且這個正在執行的協同程式只有在明確的被要求掛起的時候才會被掛起。
協同程式有點類似同步的多執行緒,在等待同一個執行緒鎖的幾個執行緒有點類似協同。


coroutine.create()  建立coroutine,返回coroutine, 引數是一個函式,當和resume配合使用的時候就喚醒函式呼叫

coroutine.resume()  重啟coroutine,和create配合使用

coroutine.yield()   掛起coroutine,將coroutine設定為掛起狀態,這個和resume配合使用能有很多有用的效果

coroutine.status()  檢視coroutine的狀態
注:coroutine的狀態有三種:dead,suspend,running,具體什麼時候有這樣的狀態請參考下面的程式

coroutine.wrap()    建立coroutine,返回一個函式,一旦你呼叫這個函式,就進入coroutine,和create功能重複

coroutine.running() 返回正在跑的coroutine,一個coroutine就是一個執行緒,當使用running的時候,就是返回一個corouting的執行緒號

--]]


--[[
協同有三個狀態:掛起態(suspended)、執行態(running)、停止態(dead)。當我們建立協同程式成功時,其為掛起態,即此時協同程式並未執行。我們可用status函式檢查協同的狀態:
--]]

co = coroutine.create(
    function()
        print("Hello coroutine!")
end)

print(coroutine.status(co)) -- suspended

print("\n----------\n")
co = coroutine.create(function (a,b,c)
    print("co", a,b,c)
end)
print(coroutine.resume(co, 1, 2, 3))




-- 函式coroutine.resume使協同程式由掛起狀態變為執行態:
coroutine.resume(co)

--本例中,協同程式打印出"hi"後,任務完成,便進入終止態:
print(coroutine.status(co))     --> dead

print("\n----------\n")
--協同真正的強大之處在於yield,可以將正在執行的程式碼掛起
co = coroutine.create(function ()
    for i=1,10 do
       print("co", i)
       coroutine.yield()
    end
end)

coroutine.resume(co)
print(coroutine.status(co))
coroutine.resume(co)

--------------------------------------------------------Lua 模組---------------------------------------------------------------------
--[[
模組類似於一個封裝庫
可以把一些公用的程式碼放在一個檔案裡,以 API 介面的形式在其他地方呼叫,有利於程式碼的重用和降低程式碼耦合度。

Lua 的模組是由變數、函式等已知元素組成的 table,因此建立一個模組很簡單,就是建立一個 table,然後把需要匯出的常量、函式放入其中,最後返回這個 table 就行。
--]]



module = {}

module.constant = "Define constant"

function module.fn1()
    print("定義一個公有函式!")
end

local function fn2()
    print("私有函式")
end

return module

---載入模組
--[[

Lua提供了一個名為require的函式用來載入模組。要載入一個模組,只需要簡單地呼叫就可以了。例如:
require("<模組名>")
或者
require "<模組名>"
-- ]]