從打印hello world開始
輸入命令 lua -i 或 lua 來啓用交互式編程模式,使用print函數打印字符串"hello world":
[root@vmzq1l0l ~]# lua
Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio
> print("hello world")
hello world
>
有交互是編程,也有腳本式編程
編寫腳本指定解釋器爲 /bash/lua (本人爲centos7的系統,自帶lua,如果其他版本沒有Lua的需要自行安裝)
編寫腳本
[root@vmzq1l0l ~]# vim hello.lua
腳本內容
#!/bin/lua
print("hello world")
執行腳本
[root@vmzq1l0l ~]# lua hello.lua
hello world
賦權後直接執行賦權操作只需執行一次
[root@vmzq1l0l ~]# chmod +x hello.lua
[root@vmzq1l0l ~]# ./hello.lua
hello world
數據類型
Lua中有8個基本類型分別爲:nil、boolean、number、string、userdata、function、thread和table
數據類型 | 描述 |
---|---|
nil | 這個最簡單,只有值nil屬於該類,表示一個無效值(在條件表達式中相當於false) |
boolean | 包含兩個值:false和true |
number | 表示雙精度類型的實浮點數 |
string | 字符串由一對雙引號或單引號來表示 |
function | 由 C 或 Lua 編寫的函數 |
userdata | 表示任意存儲在變量中的C數據結構 |
thread | 表示執行的獨立線路,用於執行協同程序 |
table | Lua 中的表(table)其實是一個"關聯數組"(associative arrays),數組的索引可以是數字或者是字符串。在 Lua 裏,table 的創建是通過"構造表達式"來完成,最簡單構造表達式是{},用來創建一個空表 |
type函數可以查看數據類型
[root@vmzq1l0l ~]# lua
Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio
> print(type(nil))
nil
> print(type(true))
boolean
> print(type("hello world"))
string
> print(type(type))
function
> print(type(23))
number
通過例子快速瞭解其中幾個數據類型和邏輯處理的語法
string
聲明string變量“Tom”,此處是全局變量,只要不退出客戶端界面,就可以一直使用這個變量
local聲明string變量“Jerry”,這是個局部變量,只能在當前作用域使用
> Tom="I'm a cat"
> print(Tom)
I'm a cat
> local Jerry="I'm a mouse" print(Jerry) --局部變量只能在當前作用域使用
I'm a mouse
> print(Jerry)
nil
> local Jerry="I'm a mouse" print(type(Jerry)) --局部變量只能在當前作用域使用
string
> print(type(Jerry))
nil
> print(Tom)
I'm a cat
> print(type(Tom))
string
string塊用兩個方括號括起來可以換行,換行之後前面會變成兩個大於號>>,直到]]封尾
> Tom=[[I'm a cat;
>> I hate Spike]]
> print(Tom)
I'm a cat;
I hate Spike
拼接字符串,使用 … 兩個英文句號拼接字符串
> Tom="I'm a cat;"
> Jerry="I'm a mouse;"
> print(Tom .. Jerry) --使用..來拼接字符串
I'm a cat;I'm a mouse;
延伸:註釋
-- 爲lua單行註釋
--[[
這是多行註釋
--]]
boolean
> print(type(true))
boolean
> print(type(false))
boolean
> if false or nil
>> then
>> print("至少有一個是true")
>> else
>> print("false和nil都是false")
>> end
false和nil都是false
number
lua可以對number類型的數據進行運算
> a=12
> b=34
> c=a+b
> d=a-b
> e=a/b
> print(c)
46
> print(d)
-22
> print(e)
0.35294117647059
> print(type(c))
number
> print(type(d))
number
> print(type(e))
number
table
table有點像java中的map可以自定義key值,但是不定義key值的話key默認從1開始索引
> table1={key="val1",key2="val2",key3="val3"}
> print(type(table1))
table
> print(table1["key"])
val1
> print(table1["key3"])
val3
> table2={"Tom","Jerry","Spike"}
> print(type(table2))
table
> print(table2[0])
nil
> print(table2[1])
Tom
> print(table2[2])
Jerry
寫個腳本table1.lua,for循環中的k,v是自定義的,可以寫任何名稱a,b;key,val···目的就是代表q前一個是索引,後一個是值,pairs()裏面放要循環的table名
#!/bin/lua
table1={}
table1["key"]="value"
key = 5
table1[key] = 15
table1[key] = table1[key] + 10
for k,v in pairs(table1) do
print(k .. ":" .. v)
end
執行結果
[root@vmzq1l0l ~]# lua table1.lua
key:value
5:25
function
在 Lua 中,函數是被看作是"第一類值(First-Class Value)",函數可以存在變量裏:
寫一個腳本function_test.lua,這個腳本內部相當於遞歸調用自己的方法進行階乘的運算
#!/bin/lua
function factorial1(n)
if n == 0 then
return 1
else
return n*factorial1(n-1)
end
end
print(factorial1(5))
factorial2=factorial1
print(factorial2(5))
執行結果
[root@vmzq1l0l ~]# lua function_test.lua
120
120
function 可以以匿名函數(anonymous function)的方式通過參數傳遞,寫一個腳本function_test2.lua
#!/bin/lua
function testFun(tab,fun)
for key,val in pairs(tab) do
print(fun(key,val))
end
end
tab={key1="val1",key2="val2"}
testFun(tab,
function(key,val) --匿名函數
return key.."="..val
end
)
執行結果
[root@vmzq1l0l ~]# lua function_test2.lua
key1=val1
key2=val2
thread
在 Lua 裏,最主要的線程是協同程序(coroutine)。它跟線程(thread)差不多,擁有自己獨立的棧、局部變量和指令指針,可以跟其他協同程序共享全局變量和其他大部分東西
線程跟協程的區別:線程可以同時多個運行,而協程任意時刻只能運行一個,並且處於運行狀態的協程只有被掛起(suspend)時纔會暫停
userdata
userdata 是一種用戶自定義數據,用於表示一種由應用程序或 C/C++ 語言庫所創建的類型,可以將任意 C/C++ 的任意數據類型的數據(通常是 struct 和 指針)存儲到 Lua 變量中調用