Lua基礎學習總結

介紹

1. 定義:

Lua是一種輕量小巧的腳本語言,用標準C語言編寫並以源代碼形式開放,其設計目的是爲了嵌入應用程序中,從而爲應用程序提供靈活的擴展和定製功能。

2. 特性:

  • 輕量級: 它用標準C語言編寫並以源代碼形式開放,編譯後僅僅一百餘K,可以很方便的嵌入別的程序裏。
  • 可擴展: Lua提供了非常易於使用的擴展接口和機制:由宿主語言(通常是C或C++)提供這些功能,Lua可以使用它們,就像是本來就內置的功能一樣。
  • 支持面向過程(procedure-oriented)編程和函數式編程(functional programming);
  • 自動內存管理;只提供了一種通用類型的表(table),用它可以實現數組,哈希表,集合,對象;

3. 應用場景

遊戲開發、獨立應用腳本、Web應用腳本、擴展和數據庫插件如:MySQL Proxy 和 MySQL WorkBench等。

準備

> 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

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