亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Lua極簡(jiǎn)入門指南(一):基礎(chǔ)知識(shí)篇

 更新時(shí)間:2014年10月25日 15:30:23   投稿:junjie  
這篇文章主要介紹了Lua極簡(jiǎn)入門指南(一):基礎(chǔ)知識(shí)篇,本文羅列了Lua的基礎(chǔ)知識(shí),如注釋、數(shù)據(jù)類型、table、循環(huán)控制結(jié)構(gòu)等內(nèi)容,需要的朋友可以參考下

本文是《Programming in Lua 3rd》讀書(shū)筆記。

Chunks

一個(gè) Chunk 就是一組被執(zhí)行的語(yǔ)句,例如一個(gè)文件或者交互模式下的一行。

標(biāo)識(shí)符(identifiers)

我們應(yīng)該避免使用以 _ 開(kāi)頭并跟上一個(gè)或者多個(gè)大寫字母的字符串來(lái)作標(biāo)識(shí)符,它們被保留作特殊的用途(例如:_VERSION)。

注釋

單行注釋使用

復(fù)制代碼 代碼如下:

--

多行注釋使用
復(fù)制代碼 代碼如下:

--[[ 和 --]]

類型簡(jiǎn)介

Lua 存在的數(shù)據(jù)類型包括:

1.nil。此類型只有一個(gè)值 nil。用于表示“空”值。全局變量默認(rèn)為 nil,刪除一個(gè)已經(jīng)賦值的全局變量只需要將其賦值為 nil(對(duì)比 JavaScript,賦值 null 并不能完全刪除對(duì)象的屬性,屬性還存在,值為 null)

2.boolean。此類型有兩個(gè)值 true 和 false。在 Lua 中,false 和 nil 都表示條件假,其他值都表示條件真(區(qū)別于 C/C++ 等語(yǔ)言的是,0 是真)

3.number。雙精浮點(diǎn)數(shù)(IEEE 754 標(biāo)準(zhǔn)),Lua 沒(méi)有整數(shù)類型

4.string。你可以保存任意的二進(jìn)制數(shù)據(jù)到字符串中(包括 0)。字符串中的字符是不可以改變的(需要改變時(shí),你只能創(chuàng)建一個(gè)新的字符串)。獲取字符串的長(zhǎng)度,可以使用 # 操作符(長(zhǎng)度操作符)。例如:print(#”hello”)。字符串可以使用單引號(hào),也可以使用雙引號(hào)包裹,對(duì)于多行的字符串還可以使用 [[ 和 ]] 包裹。字符串中可以使用轉(zhuǎn)義字符,例如 \n \r 等。使用 [[ 和 ]] 包裹的字符串中的轉(zhuǎn)義字符不會(huì)被轉(zhuǎn)義

5.userdata。用于保存任意的 C 數(shù)據(jù)。userdata 只能支持賦值操作和比較測(cè)試

6.function。函數(shù)是第一類值(first-class value),我們能夠像使用其他變量一樣的使用函數(shù)(函數(shù)能夠保存在變量中,可以作為參數(shù)傳遞給函數(shù))

7.thread。區(qū)別于我們常常說(shuō)的系統(tǒng)級(jí)線程

8.table。被實(shí)現(xiàn)為關(guān)聯(lián)數(shù)組(associative arrays),可以通過(guò)任何值來(lái)進(jìn)行索引(nil 除外)。和全局變量一樣,table 中未賦值的域?yàn)?nil,刪除一個(gè)域只需要將其賦值為 nil(實(shí)際上,全局變量就是被放置在一個(gè) table 中)

type 函數(shù)用于返回值的類型:

復(fù)制代碼 代碼如下:

print(type("Hello World")) --> string
print(type(10.4*3))        --> number
print(type(print))         --> function
print(type(type(X)))       --> string

在 Lua 中,任何的變量都可以保存任何的值。

table 使用簡(jiǎn)介

使用構(gòu)造表達(dá)式可以創(chuàng)建一個(gè) table:

復(fù)制代碼 代碼如下:

-- 創(chuàng)建一個(gè)空的 table
a = {}
 
-- 創(chuàng)建并初始化一個(gè) table,這里
-- days[1] == "Sunday"
-- days[2] == "Monday"
-- ...
days = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" }
 
-- 創(chuàng)建并初始化一個(gè) table,這里
-- a["x"] == 10
-- a["y"] == 20
a = { x = 10, y = 20 }

使用 [] 操作符訪問(wèn) table 的域:

復(fù)制代碼 代碼如下:

a = {}
k = "x"
a[k] = 10
a["x"] = 20
print(a["y"]) --> nil
a.x = 30

注意,a.name 的語(yǔ)法等價(jià)于 a["name"]。

table 可以用于表示數(shù)組,這時(shí)候索引為整數(shù),并且從 1(而非 0)開(kāi)始,例如:

復(fù)制代碼 代碼如下:

a = { 'a', 'b' }
a[1] == 'a'
a[2] == 'b'

長(zhǎng)度操作符可以獲取 table 數(shù)組部分的長(zhǎng)度:

復(fù)制代碼 代碼如下:

a = {}
a[1] = 1
a[2] = 2
print(#a) --> 2
 
a.a = 1
a.b = 2
print(#a) --> 2
 
a = {}
a.a = 1
a.b = 2
print(#a) --> 0

表達(dá)式

算術(shù)操作符

1.+(加)
2.-(減)
3.*(乘)
4./(除)
5.^(冪)
6.%(取模)

任何算術(shù)操作符都試圖將操作數(shù)轉(zhuǎn)換為數(shù)值類型,例如:

復(fù)制代碼 代碼如下:

print(10 + '1') --> 11

關(guān)系操作符

1.<(小于)
2.>(大于)
3.<=(小于等于)
4.>=(大于等于)
5.==(等于)
6.~=(不等于)

兩個(gè)不同類型的值是不相等的,例如:

復(fù)制代碼 代碼如下:

nil ~= false

table、userdata 類型是通過(guò)引用進(jìn)行比較的,例如:

復(fù)制代碼 代碼如下:

a = {}; a.x = 1; a.y = 0
b = {}; b.x = 1; b.y = 0
c = a

這里 a 和 c 引用一個(gè)相同的對(duì)象,因此 a == c,但是 a ~= b(即便 a、b 內(nèi)容相同)。

邏輯操作符

1.and
2.or
3.not

邏輯操作符有返回值。對(duì)于 and 操作來(lái)說(shuō),如果第一個(gè)操作數(shù)為 false 時(shí)返回此操作數(shù),否則返回第二個(gè)操作數(shù)。對(duì)于 or 操作來(lái)說(shuō),如果第一個(gè)操作數(shù)不為 false 時(shí)返回此操作數(shù),否則返回第二個(gè)操作數(shù)。

連接操作符

字符串連接可以使用連接操作符 “..”,例如:

復(fù)制代碼 代碼如下:

print("Hello " .. "World")

連接操作符試圖將操作數(shù)轉(zhuǎn)化為字符串,例如:
復(fù)制代碼 代碼如下:

print("number: " .. 1)

語(yǔ)句

多賦值(multiple assignment)支持,例如:

復(fù)制代碼 代碼如下:

a, b = 1, 2
print(a) --> 1
print(b) --> 2

多賦值的一個(gè)慣用法就是交換兩個(gè)變量的值:
復(fù)制代碼 代碼如下:

x, y = 1, 2
x, y = y, x
print(x) --> 2
print(y) --> 1

創(chuàng)建局部變量使用 local:
復(fù)制代碼 代碼如下:

j = 10       -- 全局變量 j
local i = 10 -- 局部變量 i

局部變量的作用域限制于他們聲明的塊(block)。塊(block)包括:

1.控制結(jié)構(gòu)的主體部分
2.函數(shù)體
3.chunk
4.do-end

范例:

復(fù)制代碼 代碼如下:

if true then
    local x = 20
    print(x) --> 20
end
 
print(x) --> nil

我們可以使用 do-end 關(guān)鍵字來(lái)構(gòu)造一個(gè)塊:
復(fù)制代碼 代碼如下:

do
    local x = 20
    print(x) --> 20
end
 
print(x) --> nil

訪問(wèn)局部變量要快于訪問(wèn)全局變量。在 Lua 中有一個(gè)習(xí)慣用法:
復(fù)制代碼 代碼如下:

local foo = foo

用于創(chuàng)建一個(gè)局部變量并初始化為同名的全局變量。這樣做常常出于兩個(gè)原因:

1.避免某些類型的全局變量被修改
2.提高訪問(wèn)速度

控制結(jié)構(gòu)

if then elseif else

復(fù)制代碼 代碼如下:

if a < 0 then
    a = 0
end
 
if a < b then
    return a
else
    return b
end
 
if op == '+' then
    r = a + b
elseif op == '-' then
    r = a - b
elseif op == '*' then
    r = a * b
elseif op == '/' then
    r = a / b
else
    error('invalid operation')
end

Lua 中沒(méi)有 switch 語(yǔ)句。

while

復(fù)制代碼 代碼如下:

local i = 1
while a[i] do
    print(a[i])
    i = i + 1
end

repeat

復(fù)制代碼 代碼如下:

repeat
    line = io.read()
until line ~= ''
print(line)

區(qū)別于 while,repeat 會(huì)先執(zhí)行循環(huán)體,然后判斷測(cè)試條件。

數(shù)值型 for(numeric for)

for 有兩種:

數(shù)值型 for(numeric for)

1.泛型 for(generic for)
2.數(shù)值型 for 的語(yǔ)法如下:

復(fù)制代碼 代碼如下:

for var = exp1, exp2, exp3 do
    <something>
end

這里 exp1 作為 var 的初始值,exp2 為 var 的最大值,exp3 為 var 每次遞增的值,exp3 是可選的,默認(rèn)為 1。范例:
復(fù)制代碼 代碼如下:

-- 輸出 1 2 3
for i = 1, 3 do
    print(i)
end

有一些需要注意的地方:

1.for 中的 exp1、exp2、exp3 只會(huì)被計(jì)算一次值,例如:

復(fù)制代碼 代碼如下:

for i = 1, f(x) do print(i) end

這里的 f(x) 只會(huì)被調(diào)用一次

2.控制變量 var 只是一個(gè)局部變量
3.不要嘗試去修改控制變量 var 的值(結(jié)果是未知的)

泛型 for

泛型 for 通過(guò)一個(gè)迭代器函數(shù)來(lái)實(shí)現(xiàn)遍歷,例如:

復(fù)制代碼 代碼如下:

for k, v in pairs(t) do
    print(k, v)
end

這里的 pairs 就是一個(gè)迭代器函數(shù),此 for 循環(huán)遍歷 table t,每次獲取到的 key 保存在變量 k 中,獲取到的 value 保存在變量 v 中。除了 pairs 還有其他的迭代器可以用:

1.io.lines 可用于迭代文件中的行
2.ipairs 可用于迭代 table 的數(shù)組部分

我們還可以自己編寫迭代器。

break、return、goto

break 語(yǔ)句用于跳出一個(gè)循環(huán)(for、repeat、while)。

return 語(yǔ)句用于為函數(shù)返回結(jié)果。在 Lua 中,return 語(yǔ)句必須是一個(gè)塊的最后一條語(yǔ)句,看一個(gè)例子:

復(fù)制代碼 代碼如下:

function foo()
    -- 語(yǔ)法錯(cuò)誤
    return
    local i = 1
end

有時(shí)候,我們出于某些原因(例如為了 debug),我們需要在一個(gè)函數(shù)中插入一個(gè) return 語(yǔ)句,這時(shí)候可以這么做:

復(fù)制代碼 代碼如下:

function foo()
    -- ...
    do return end
    -- ...
end

goto 語(yǔ)句用于在函數(shù)中跳轉(zhuǎn)。goto 語(yǔ)句可以讓執(zhí)行跳轉(zhuǎn)到特定的標(biāo)簽(label)處,例如:

復(fù)制代碼 代碼如下:

goto quit
print('come on')
::quit::
print('quit')

這里輸出 quit。正如我們看到的,標(biāo)簽的寫法為 ::name::。goto 跳轉(zhuǎn)也是存在限制的:

1.不允許跳轉(zhuǎn)到一個(gè)塊中去
2.不允許跳轉(zhuǎn)到函數(shù)之外去
3.不允許跳入局部變量的作用域中

對(duì)于第三點(diǎn),看一個(gè)例子:

復(fù)制代碼 代碼如下:

goto quit
local a
::quit::
print('quit')

這里,會(huì)出現(xiàn)語(yǔ)法錯(cuò)誤(jumps into the scope of local 'a')。但是,有一個(gè)細(xì)節(jié)需要注意,我們先修改上面的例子:

復(fù)制代碼 代碼如下:

goto quit
local a
::quit::

執(zhí)行成功,沒(méi)有語(yǔ)法錯(cuò)誤。這是因?yàn)榫植孔兞康淖饔糜蚪Y(jié)束于變量定義的塊的最后一個(gè)非 void 語(yǔ)句,而標(biāo)簽被認(rèn)為是一個(gè) void 語(yǔ)句,對(duì)于上面的例子來(lái)說(shuō),a 的作用域在 ::quit:: 之前就結(jié)束了,因此 goto quit 并沒(méi)有跳入局部變量 a 的作用域中。

利用 goto 可以比較方便的編寫狀態(tài)機(jī),例如(s1、s2 為狀態(tài)):

復(fù)制代碼 代碼如下:

::s1:: do
    local c = io.read(1)
    if c == '0' then goto s2
    elseif c == nil then print'ok'; return
    else goto s1
    end
end
 
::s2:: do
    local c = io.read(1)
    if c == '0' then goto s1
    elseif c == nil then print'not ok'; return
    else goto s2
    end
end
 
goto s1

相關(guān)文章

  • Lua中操作字符串的基本方法整理

    Lua中操作字符串的基本方法整理

    這篇文章主要介紹了Lua中操作字符串的基本方法整理,是Lua入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-05-05
  • 在Lua程序中使用SQLite的教程

    在Lua程序中使用SQLite的教程

    這篇文章主要介紹了在Lua程序中使用SQLite的教程,包括建立連接到基本的查詢等一些操作,需要的朋友可以參考下
    2015-05-05
  • Openresty服務(wù)器使用lua腳本寫的Hello World簡(jiǎn)單實(shí)例

    Openresty服務(wù)器使用lua腳本寫的Hello World簡(jiǎn)單實(shí)例

    這篇文章主要介紹了Openresty服務(wù)器使用lua腳本寫的Hello World簡(jiǎn)單實(shí)例,OpenResty (也稱為 ngx_openresty)是一個(gè)全功能的 Web 應(yīng)用服務(wù)器。它打包了標(biāo)準(zhǔn)的 Nginx 核心,很多的常用的第三方模塊,以及它們的大多數(shù)依賴項(xiàng),需要的朋友可以參考下
    2015-04-04
  • Lua教程(十七):C API簡(jiǎn)介

    Lua教程(十七):C API簡(jiǎn)介

    這篇文章主要介紹了Lua教程(十七):C API簡(jiǎn)介,本文講解了基礎(chǔ)知識(shí)、棧、C API中的錯(cuò)誤處理、Lua調(diào)用C程序、C程序調(diào)用Lua代碼的錯(cuò)誤處理等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • Lua中的迭代器淺析

    Lua中的迭代器淺析

    這篇文章主要介紹了Lua中的迭代器淺析,本文先是講解了什么是迭代器,然后給出了自己寫一個(gè)迭代器的示例,最后介紹了迭代器的調(diào)用方法,需要的朋友可以參考下
    2014-09-09
  • 舉例詳解Lua中的協(xié)同程序編程

    舉例詳解Lua中的協(xié)同程序編程

    這篇文章主要介紹了Lua中的協(xié)同程序編程,是Lua入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-05-05
  • Lua數(shù)據(jù)類型介紹

    Lua數(shù)據(jù)類型介紹

    這篇文章主要介紹了Lua數(shù)據(jù)類型介紹,本文講解了Lua中的nil(空)、boolean(布爾)、number(數(shù)字)、string(字符串)、table(表)、function(函數(shù))、thread(線程)、userdata(自定義類型)等數(shù)據(jù)類型,需要的朋友可以參考下
    2014-12-12
  • Lua中獲取table長(zhǎng)度的方法

    Lua中獲取table長(zhǎng)度的方法

    這篇文章主要介紹了Lua中獲取table長(zhǎng)度的方法,本文用多個(gè)實(shí)例講解多種情況下獲取Table長(zhǎng)度的方法,需要的朋友可以參考下
    2015-04-04
  • Lua中基本的數(shù)據(jù)類型、表達(dá)式與流程控制語(yǔ)句講解

    Lua中基本的數(shù)據(jù)類型、表達(dá)式與流程控制語(yǔ)句講解

    這篇文章主要介紹了Lua中基本的數(shù)據(jù)類型、表達(dá)式與流程控制語(yǔ)句講解,總結(jié)了Lua入門學(xué)習(xí)中的基礎(chǔ)語(yǔ)法知識(shí),需要的朋友可以參考下
    2016-06-06
  • 利用Lua定制Redis命令的方法詳解

    利用Lua定制Redis命令的方法詳解

    這篇文章主要給大家介紹了關(guān)于利用Lua定制Redis命令的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03

最新評(píng)論