Lua的基本使用

從打印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 變量中調用

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