Lua學習總結一

對於Lua語言,一直以來我都覺得它很神祕。作爲遊戲開發中非常常用的腳本語言,它存在很多讓人耳目一新的特性。最近學習了Lua編程,熟悉了C#之後,再來學習另一門語言其實不是很吃力。

Lua的內容也很多,不過沒有必要寫的太詳細,所以學習總結只是對比C#語言來看看Lua有什麼不同之處。

1.註釋和debug

Lua中單行註釋使用 -- 多行註釋則使用--[[  這裏是註釋  --]]

輸出debug的話就很熟悉了:print(),和Unity 3D中的控制檯輸出print()以及Debug.Log()相同

2.標示符命名規則

變量、方法的命名,按照我們現在使用的駝峯命名法是沒有問題的,下劃線儘量不要配合大寫字母使用也是沒有問題的。

3.數據類型

在C#中有15中內置類型:

整型:sbyte、byte、short、ushort、int、uint、long、ulong;

浮點型:float、double;

decimal類型:更高精度的浮點型,至今沒有用到過;

bool類型;

字符型:char;

object類型;

string類型;

然而在Lua中,數據類型就很簡單了:

string類型:表示字符串

boolean類型:true和false

nil類型:空類型表示一個無效值,可用在bool判斷中,與C#中的null類似;

number類型:表示數字

function類型:編寫的函數,函數也可以作爲一個類型,因此可以把函數當成值來傳遞,與C#中的委託遙相呼應;

table類型:同時擁有C#中字典和List類的特性,現階段可以理解它是一個數組。

thread類型:用於執行協同程序

userdata類型:我們可以類比C#中的結構體來理解,用戶可以自己定義屬性的類型。

4.變量的聲明

與C#不同的是,Lua中變量的聲明不需要指定其類型,變量的類型隨着值的變化而變化。所以我們可以說Lua是個類型不安全的語言。

既然聲明的時候沒有指定類型,那麼變量的初始值就統一爲nil,不像C#中int的初始值爲0,string的初始值爲" "。

5.Lua中的字符串

Lua中的字符串可以設置多行,使用[[ ]]包裹起來即可

C#中通過字符串的.length()方法獲取字符串的長度,而Lua中可以使用  #"xxxxxx" 來獲取,這個語句會返回一個number類型的數字,數字的大小就是雙引號內字符串的長度。

C#中可以通過+來拼接字符串,但是在Lua中是行不通的。

"2"+"3"、2+"3"都會得到number類型的數字5,也就是說加號+只用於number類型。"num"+"ber"會報錯。Lua中是通過下面的形式來拼接字符串的:

"num".."ber"
"user"..1

6.table表

table表的聲明就不用說了,很簡單。值得注意的是table表中元素是以key-value鍵值對的形式存在的。同時也就弱化了table中索引的概念,Lua中的索引是從1開始的,table中的key一般使用number類型或者string類型。

Lua中的for循環一般是這樣使用的:

tab1={}

for i=0,10 do
     tab1[i]=i
end
for key,val in pairs(tab1) do
     --TODO
end

看起來很奇怪,寫多了就適應了。

對於table,還有一個問題就是刪除一個元素,後面的元素不會向前移動,也就是說刪除中間一個元素後的table,索引不是連着的。

7.nil的用法

當給一個變量賦值nil後,不僅變量值爲空,所佔用的內存也會被清空。

8.function的用法

無論是for還是function,程序塊的結束是以end爲結尾的:

function fun(n)
    if n==1 then
        print("n=1")
    else
        print("n=0")
    end
end

上面的代碼包括了帶參函數的聲明,也包含了Lua中if的用法,都很簡潔,也很簡單。

要注意一點的是直接聲明的變量默認是全局變量,要聲明局部變量需要在前面加上local變量

function fun2()
    b=0
    local a="a"
end

fun2()

print(b)
print(a)

上面這段代碼最終輸出的結果爲:

但是如果我們在輸出之前不執行這個方法,運行結果就會不一樣了:

function fun2()
    b=0
    local a="a"
end

print(b)
print(a)

運行結果:

兩次輸出都是nil,爲什麼b定義成全局變量,而且已經賦值了,還是nil?

這就是動態語言的特性。

動態語言沒有編譯的過程,方法定義了之後被調用執行了之後,方法裏面的代碼纔會被執行,只有fun2被調用,b才被定義,否則的話都是沒有被聲明定義,自然是nil了。

我們之前說function是一個類型,爲什麼這麼說呢?我們來看看一個騷操作:

就問你6不6?

這年頭方法都跟變量一起同流合污了,啥都幹。

不過現階段的瞭解來看,意義不大,直接調用不好嗎?非得這麼騷包的再賦值?

9.變量的賦值

我們在C#中經常可以用到一行聲明多個同類型變量:

int score,age,id;

然而,Lua中不僅可以一行聲明多個變量,還能同時給多個變量賦值:

a,b,c=1,"num",true
print(a,b,c)

a,b,c=1,"num"
print(a,b,c)

a,b,c=1,"num",true,0
print(a,b,c)

運行結果:

原則是這樣的:當值的個數大於變量的個數時,多餘的值會被忽略;當值的個數小於變量的個數時,多餘的變量值爲nil,至於個數相等,你等的哦。

同時,Lua中竟然還有這種操作:

Lua的文檔解釋是這樣的:當進行=的賦值操作時,系統會優先計算等號右側並得到值,然後再賦值給左側。

不知道以後面試的時候面試官讓我不通過第三變量來交換兩個變量的值的時候我這樣寫會不會被打死。。。

然後呢,我們再來看看賦值的時候還有什麼騷操作:

直接返回了兩個值,不跟你多羅嗦,就是這麼簡單粗暴!

一開始覺得Lua其實挺麻煩的,很多東西都沒有必要。隨着學習的進行,反而覺得很靈活很方便。是C#先入爲主了,不知不覺中固定了思維,以後學習要開拓思維,掌握更多的程序設計思想。

老規矩:有任何疑問或錯誤,歡迎大家指正!謝謝。

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