亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

Lua極簡入門指南(一):基礎知識篇

2024-07-21 23:04:16
字體:
來源:轉載
供稿:網友

本文是《Programming in Lua 3rd》讀書筆記。

Chunks

一個 Chunk 就是一組被執行的語句,例如一個文件或者交互模式下的一行。

標識符(identifiers)

我們應該避免使用以 _ 開頭并跟上一個或者多個大寫字母的字符串來作標識符,它們被保留作特殊的用途(例如:_VERSION)。

注釋

單行注釋使用

復制代碼 代碼如下:

--

多行注釋使用
復制代碼 代碼如下:

--[[ 和 --]]

 

類型簡介

Lua 存在的數據類型包括:

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

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

3.number。雙精浮點數(IEEE 754 標準),Lua 沒有整數類型

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

5.userdata。用于保存任意的 C 數據。userdata 只能支持賦值操作和比較測試

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

7.thread。區別于我們常常說的系統級線程

8.table。被實現為關聯數組(associative arrays),可以通過任何值來進行索引(nil 除外)。和全局變量一樣,table 中未賦值的域為 nil,刪除一個域只需要將其賦值為 nil(實際上,全局變量就是被放置在一個 table 中)

type 函數用于返回值的類型:

 

復制代碼 代碼如下:

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

 

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

table 使用簡介

使用構造表達式可以創建一個 table:

復制代碼 代碼如下:

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

 

使用 [] 操作符訪問 table 的域:

復制代碼 代碼如下:

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

 

注意,a.name 的語法等價于 a["name"]。

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

復制代碼 代碼如下:

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

 

長度操作符可以獲取 table 數組部分的長度:

 

復制代碼 代碼如下:

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

 

表達式

算術操作符

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

任何算術操作符都試圖將操作數轉換為數值類型,例如:

 

復制代碼 代碼如下:

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

 

關系操作符

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

兩個不同類型的值是不相等的,例如:

復制代碼 代碼如下:

nil ~= false

 

table、userdata 類型是通過引用進行比較的,例如:

 

復制代碼 代碼如下:

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

 

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

邏輯操作符

1.and
2.or
3.not

邏輯操作符有返回值。對于 and 操作來說,如果第一個操作數為 false 時返回此操作數,否則返回第二個操作數。對于 or 操作來說,如果第一個操作數不為 false 時返回此操作數,否則返回第二個操作數。

連接操作符

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

復制代碼 代碼如下:

print("Hello " .. "World")

連接操作符試圖將操作數轉化為字符串,例如:
復制代碼 代碼如下:

print("number: " .. 1)

 

語句

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

復制代碼 代碼如下:

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

多賦值的一個慣用法就是交換兩個變量的值:
復制代碼 代碼如下:

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

創建局部變量使用 local:
復制代碼 代碼如下:

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

 

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

1.控制結構的主體部分
2.函數體
3.chunk
4.do-end

范例:

復制代碼 代碼如下:

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

我們可以使用 do-end 關鍵字來構造一個塊:
復制代碼 代碼如下:

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

訪問局部變量要快于訪問全局變量。在 Lua 中有一個習慣用法:
復制代碼 代碼如下:

local foo = foo

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

 

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

控制結構

if then elseif else

 

復制代碼 代碼如下:

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 中沒有 switch 語句。

while

 

復制代碼 代碼如下:

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

 

repeat

 

復制代碼 代碼如下:

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

 

區別于 while,repeat 會先執行循環體,然后判斷測試條件。

數值型 for(numeric for)

for 有兩種:

數值型 for(numeric for)

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

復制代碼 代碼如下:

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

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

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

 

有一些需要注意的地方:

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

復制代碼 代碼如下:

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

這里的 f(x) 只會被調用一次

 

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

泛型 for

泛型 for 通過一個迭代器函數來實現遍歷,例如:

 

復制代碼 代碼如下:

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

 

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

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

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

break、return、goto

break 語句用于跳出一個循環(for、repeat、while)。

return 語句用于為函數返回結果。在 Lua 中,return 語句必須是一個塊的最后一條語句,看一個例子:

復制代碼 代碼如下:

function foo()
    -- 語法錯誤
    return
    local i = 1
end

 

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

 

復制代碼 代碼如下:

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

 

goto 語句用于在函數中跳轉。goto 語句可以讓執行跳轉到特定的標簽(label)處,例如:

 

復制代碼 代碼如下:

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

 

這里輸出 quit。正如我們看到的,標簽的寫法為 ::name::。goto 跳轉也是存在限制的:

1.不允許跳轉到一個塊中去
2.不允許跳轉到函數之外去
3.不允許跳入局部變量的作用域中

對于第三點,看一個例子:

 

復制代碼 代碼如下:

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

 

這里,會出現語法錯誤(jumps into the scope of local 'a')。但是,有一個細節需要注意,我們先修改上面的例子:

 

復制代碼 代碼如下:

goto quit
local a
::quit::

 

執行成功,沒有語法錯誤。這是因為局部變量的作用域結束于變量定義的塊的最后一個非 void 語句,而標簽被認為是一個 void 語句,對于上面的例子來說,a 的作用域在 ::quit:: 之前就結束了,因此 goto quit 并沒有跳入局部變量 a 的作用域中。

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

 

復制代碼 代碼如下:

::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
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
两个人的视频www国产精品| 91精品91久久久久久| 欧美国产亚洲视频| 国产a∨精品一区二区三区不卡| www.xxxx欧美| 久久久免费精品| 国色天香2019中文字幕在线观看| 亚洲va国产va天堂va久久| 久久久久久综合网天天| 亚洲精品有码在线| 都市激情亚洲色图| 欧美香蕉大胸在线视频观看| 成人免费福利视频| 日韩av色综合| 中文字幕亚洲综合久久| 国产在线视频2019最新视频| 日本精品性网站在线观看| 亚洲国产精品中文| 狠狠色香婷婷久久亚洲精品| 国产欧美日韩中文| 亚洲男人天堂2023| 2019国产精品自在线拍国产不卡| 欧美另类第一页| 欧美精品一区二区免费| 成人欧美一区二区三区在线湿哒哒| 欧美—级a级欧美特级ar全黄| 2019中文字幕在线| 少妇激情综合网| 成人精品视频在线| 5566日本婷婷色中文字幕97| 久久久999精品免费| 成人妇女免费播放久久久| 日韩av大片免费看| 国产精品mp4| 亚洲精品短视频| 亚洲欧美日韩一区二区三区在线| 51色欧美片视频在线观看| 色综合久久中文字幕综合网小说| 国模精品视频一区二区| 欧美丰满老妇厨房牲生活| 国产一区深夜福利| 日韩高清电影免费观看完整版| 欧美在线视频播放| 久久中文精品视频| 日韩国产一区三区| 亚洲自拍偷拍一区| 亚洲国产精品va在线观看黑人| 欧美精品www| 久久国产精品影片| 久久av红桃一区二区小说| 黄色一区二区三区| 成人精品久久一区二区三区| 午夜精品一区二区三区在线播放| 日韩av色在线| 亚洲第一中文字幕| 亚洲国产私拍精品国模在线观看| 成人自拍性视频| 国产美女高潮久久白浆| 日本精品久久久| 色中色综合影院手机版在线观看| 日本亚洲欧美成人| 欧美人与物videos| 亚洲最大在线视频| 久久色精品视频| 欧日韩在线观看| 日韩av不卡电影| 日韩h在线观看| 久久久久五月天| 日韩中文字幕网| 97国产成人精品视频| 97在线视频免费观看| 日本亚洲欧美成人| 在线成人一区二区| 亚洲欧美国产一区二区三区| 欧美成人免费在线视频| 亚洲第一精品久久忘忧草社区| 久色乳综合思思在线视频| 中文字幕日韩高清| 久久青草精品视频免费观看| 亚洲综合中文字幕68页| 国产日韩精品视频| 亚洲精品动漫100p| 精品亚洲va在线va天堂资源站| 国产女人精品视频| 久久网福利资源网站| 国产激情视频一区| 国产脚交av在线一区二区| 成人黄色片网站| 精品视频久久久久久久| 91精品国产高清久久久久久91| 国产精品99导航| 91麻豆国产语对白在线观看| 国产成人亚洲综合91精品| 久久99精品久久久久久琪琪| 久久精品国产亚洲一区二区| 国产精品普通话| 在线观看日韩www视频免费| 国产成人一区二区三区小说| 91精品国产高清自在线看超| 蜜臀久久99精品久久久无需会员| 国产香蕉精品视频一区二区三区| 91久久久国产精品| www.久久草.com| 国产一区二区三区丝袜| 欧美精品久久久久久久| 日韩av在线播放资源| 欧美激情第99页| 日韩在线免费视频| 欧美国产乱视频| 亚洲精品久久久久久久久| 欧美性一区二区三区| 91精品久久久久久久久久| 亚洲人成啪啪网站| 亚洲第一av网站| 日韩有码在线观看| 亚洲精品wwwww| 日韩一区二区三区国产| 91国产视频在线播放| 96精品视频在线| 日韩一区二区精品视频| 这里只有精品在线观看| 日韩欧美国产一区二区| 亚洲视频视频在线| 欧美亚州一区二区三区| 欧美成人在线免费| 国产精品久久久久久久久久东京| 青草成人免费视频| 庆余年2免费日韩剧观看大牛| 日产日韩在线亚洲欧美| 亚洲色图国产精品| 亚洲自拍另类欧美丝袜| 日韩禁在线播放| 国产精品久久久久久久久久东京| xxx成人少妇69| 精品国产一区久久久| 久久99国产精品久久久久久久久| 91精品视频在线播放| 亚洲精品福利免费在线观看| 琪琪第一精品导航| 一个人www欧美| 精品久久久久人成| 91免费人成网站在线观看18| 日韩欧美中文免费| 日韩中文字幕久久| 亚洲女人初尝黑人巨大| 国产日韩精品一区二区| 51久久精品夜色国产麻豆| 91精品国产一区| 91久久精品国产91久久| 国产免费一区视频观看免费| 久久精品视频导航| 成人美女免费网站视频| 91九色单男在线观看| 亚州国产精品久久久| 欧美综合一区第一页| 亚洲免费中文字幕| 日韩成人久久久| 亚洲电影免费观看高清完整版| 久久亚洲精品一区二区| 日韩经典第一页| 亚洲乱码一区二区| 欧美黑人性生活视频| 欧美一区二粉嫩精品国产一线天| 97超级碰在线看视频免费在线看|