1.0 Lua教程之基本語法

摘自Lua教程,僅供學習,無商用

概述

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

特性

  • 輕量級: 編譯後僅僅一百餘K,可以很方便的嵌入別的程序裏
  • 可擴展: Lua**提供了易於使用的擴展接口和機制**:由宿主語言(通常是C或C++)提供這些功能,Lua可以使用它們,就像是本來就內置的功能一樣
  • 其他特性
    • 自動內存管理;只提供了一種通用類型的表(table),用它可以實現數組,哈希表,集合,對象
    • 語言內置模式匹配;閉包(closure);函數也可以看做一個值;提供多線程(協同進程,並非操作系統所支持的線程)支持
    • 通過閉包table可以很方便地支持面向對象編程所需要的一些關鍵機制,比如數據抽象,虛函數,繼承和重載等

安裝

Linux & Mac上安裝 Lua ,只需要下載源碼包並在終端解壓編譯即可

基本語法

交互式編程

Lua 提供了交互式編程模式。我們可以在命令行中輸入程序並立即查看效果。

Lua 交互式編程模式可以通過命令 lua -i 或 lua 來啓用

腳本式編程

保持到一個以 lua 結尾的文件,並執行,該模式稱爲腳本式編程(同Java,存儲代碼 運行程序(lua hello.lua))

在開頭添加:#!/usr/local/bin/lua,指定了 Lua 的解釋器 /usr/local/bin directory

爲腳本添加可執行權限:

./hello.lua

註釋

  • 單行註釋:

    • -
  • 多行註釋:

    –[=[
    多行註釋
    多行註釋
    –]=]

標識符

  • 定義一個變量,以一個字母 A 到 Z 或 a 到 z 或下劃線 _ 開頭後加上0個或多個字母,下劃線,數字(0到9)
    • 區分大小寫

全局變量

  • 默認情況下,變量總是認爲是全局的。

  • 全局變量不需要聲明,給一個變量賦值後即創建了這個全局變量,訪問一個沒有初始化的全局變量也不會出錯,只不過得到的結果是:nil

> print(b)
nil
> b=10
> print(b)
10
> 
  • 想刪除一個全局變量,只需要將變量賦值爲nil

基本數據類型

  • Lua是動態類型語言,變量不要類型定義,只需要爲變量賦值。 值可以存儲在變量中,作爲參數傳遞或結果返回。

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 的創建是通過”構造表達式”來完成,最簡單構造表達式是{},用來創建一個空表
print(type("Hello world"))      --> string
print(type(10.4*3))             --> number
print(type(print))              --> function
print(type(type))               --> function
print(type(true))               --> boolean
print(type(nil))                --> nil
print(type(type(X)))            --> string

nil

  • 該類型表示無任何有效值,只有一個值nil,打印未賦值的變量,輸出nil

  • 對於全局變量和 table,nil 還有一個”刪除”作用,給全局變量或者 table 表裏的變量賦一個 nil 值,等同於把它們刪掉

  • nil 作比較時應該加上雙引號 “
  • type(type(X))==string—>false
tab1 = { key1 = "val1", key2 = "val2", "val3" }
for k, v in pairs(tab1) do
    print(k .. " - " .. v)
end

tab1.key1 = nil
for k, v in pairs(tab1) do
    print(k .. " - " .. v)
end

> type(X)
nil
> type(X)==nil
false
> type(X)=="nil"
true
> 

布爾

Lua 把 false 和 nil 看作是”假”,其他的都爲”真”

number

Lua 默認只有一種 number 類型 – double(雙精度)類型(默認類型可以修改 luaconf.h 裏的定義)

字符串

  • 字符串由一對雙引號或單引號來表示
  • 用 2 個方括號 “[[]]” 來表示”一塊”字符串
html = [[
<html>
<head></head>
<body>
    <a href="http://www.runoob.com/">菜鳥教程</a>
</body>
</html>
]]
print(html)
  • 對一個數字字符串上進行算術操作時,Lua 會嘗試將這個數字字符串轉成一個數字
> print("2" + 6)
8.0
> print("2" + "6")
8.0
> print("2 + 6")
2 + 6
> print("-2e2" * "6")
-1200.0
> print("error" + 1)
stdin:1: attempt to perform arithmetic on a string value
stack traceback:
    stdin:1: in main chunk
    [C]: in ?
> 

以上代碼中”error” + 1執行報錯了,字符串連接使用的是 ..

> print("a" .. 'b')
ab
> print(157 .. 428)
157428
> 

使用 # 來計算字符串的長度,放在字符串前面,如print(#”www.runoob.com”)

table 的創建是通過”構造表達式”來完成,最簡單構造表達式是{},用來創建一個空表。也可以在表裏添加一些數據,直接初始化表

-- 創建一個空的 table
local tbl1 = {}

-- 直接初始表
local tbl2 = {"apple", "pear", "orange", "grape"}

表(table)其實是一個”關聯數組”(associative arrays),數組的索引可以是數字或者是字符串

-- table_test.lua 腳本文件
a = {}
a["key"] = "value"
key = 10
a[key] = 22
a[key] = a[key] + 11
for k, v in pairs(a) do
    print(k .. " : " .. v)
end

$ lua table_test.lua 
key : value
10 : 33

Lua 裏表的默認初始索引一般以 1 開始

local tbl = {"apple", "pear", "orange", "grape"}
for key, val in pairs(tbl) do
    print("Key", key)
end

$ lua table_test2.lua 
Key    1
Key    2
Key    3
Key    4

table 不會固定長度大小,有新數據添加時 table 長度會自動增長,沒初始的 table 都是 nil

a3 = {}
for i = 1, 10 do
    a3[i] = i
end
a3["key"] = "val"
print(a3["key"])
print(a3["none"])

$ lua table_test3.lua 
val
nil

函數

函數是被看作是”第一類值(First-Class Value)”,函數可以存在變量裏

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))

$ lua function_test.lua 
120
120

function 可以以匿名函數(anonymous function)的方式通過參數傳遞

-- function_test2.lua 腳本文件
function testFun(tab,fun)
    for k ,v in pairs(tab) do
        print(fun(k,v));
    end
end


tab={key1="val1",key2="val2"};
testFun(tab,
function(key,val)--匿名函數
    return key.."="..val;
end
);

$ lua function_test2.lua 
key1 = val1
key2 = val2

線程

Lua 裏,最主要的線程是協同程序(coroutine)。它跟線程(thread)差不多,擁有自己獨立的棧、局部變量和指令指針,可以跟其他協同程序共享全局變量和其他大部分東西。

線程跟協程的區別:線程可以同時多個運行,而協程任意時刻只能運行一個,並且處於運行狀態的協程只有被掛起(suspend)時纔會暫停

userdata(自定義類型)

用戶自定義數據,用於表示一種由應用程序或 C/C++ 語言庫所創建的類型,可以將任意 C/C++ 的任意數據類型的數據(通常是 struct 和 指針)存儲到 Lua 變量中調用

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