柚子快報(bào)邀請(qǐng)碼778899分享:LuatOS學(xué)習(xí)筆記
柚子快報(bào)邀請(qǐng)碼778899分享:LuatOS學(xué)習(xí)筆記
LuatOS 文檔
一、LuatOS是什么?
????????LuatOS:
針對(duì)嵌入式的腳本運(yùn)行框架,以極大提升開發(fā)效率。使用Lua 5.3作為主要語(yǔ)言,針對(duì)資源較少的嵌入式環(huán)境進(jìn)行了優(yōu)化,極大提升了運(yùn)行效率。用于物聯(lián)網(wǎng)設(shè)備的強(qiáng)大的嵌入式Lua引擎,具有許多組件,且需求內(nèi)存很少(16K RAM、128K Flash)
二、學(xué)習(xí)資源
????????Chat社區(qū)(強(qiáng)烈推薦)?地址: chat.openluat.com
? 技術(shù)支持 - LuatOS 文檔
三、Lua教程
Lua是目前嵌入式方案中,資源占用?最小?、運(yùn)行效率?最高?、語(yǔ)法?最簡(jiǎn)潔?的一門腳本語(yǔ)言。適合作為編程入門語(yǔ)言,語(yǔ)法簡(jiǎn)單。與c完美契合,LuatOS本身開源,可以輕松地用c為其添加一套c庫(kù)接口,實(shí)現(xiàn)高效。
《文字版教程》參考自:基礎(chǔ)語(yǔ)法 - LuatOS 文檔
1、初識(shí)Lua
Lua :輕量小巧的腳本語(yǔ)言,用標(biāo)準(zhǔn)C語(yǔ)言編寫、以源代碼形式開放。
Lua虛擬機(jī)可以很方便的嵌入別的程序里,為應(yīng)用程序提供靈活的擴(kuò)展和定制功能。
Lua是作為嵌入式腳本的最佳選擇:
????????整個(gè)Lua虛擬機(jī)編譯后一百余K,適當(dāng)?shù)牟眉暨€能做到更小,十分適合嵌入式的開發(fā)。
????????目前腳本引擎中,Lua的運(yùn)行速度占有絕對(duì)優(yōu)勢(shì)。
確保 英文 標(biāo)點(diǎn)符號(hào)。
第一個(gè) Lua 程序
點(diǎn)我快速測(cè)試下面的代碼
print("hello world!")
輸出數(shù)據(jù)
函數(shù)是可以實(shí)現(xiàn)某些功能的子程序,用函數(shù)名(參數(shù))來(lái)執(zhí)行。
點(diǎn)我快速測(cè)試下面的代碼
print("測(cè)試")
print("aabcdefg")
print("xxxxx","第二個(gè)參數(shù)","第三個(gè)參數(shù)")
代碼注釋
注釋不會(huì)被運(yùn)行。便于理解代碼含義。
單行注釋:用--開頭
多行注釋:用--[[開頭, --]]結(jié)尾,可以跨多行
點(diǎn)我快速測(cè)試下面的代碼
print("這段代碼會(huì)運(yùn)行")
--print("我被注釋掉了,所以不會(huì)運(yùn)行")
--[[
我是多行注釋
不管我寫多少行
都不會(huì)影響代碼運(yùn)行
--]]
變量
number變量
點(diǎn)我快速測(cè)試下面的代碼
--新建三個(gè)變量,并賦值
year = 1926
month = 8
day = 7
--打印出三個(gè)變量的值
print(year,month,day)
了解nil
nil類型:沒(méi)有任何有效值。
沒(méi)有聲明的變量,它的值就是nil
點(diǎn)我快速測(cè)試下面的代碼
ccc = 233
print(ccc)
print(aaa)
以下代碼,會(huì)輸出什么結(jié)果?
點(diǎn)我快速測(cè)試下面的代碼
a = 1
b = '2'
c = a
print(a,b,c,d)
賦值語(yǔ)句
賦值是改變一個(gè)變量值的最基本的方法。
用等號(hào)對(duì)左邊的變量進(jìn)行賦值
n = 2
n = 3
n = n + 1
b = n
Lua可以對(duì)多個(gè)變量同時(shí)賦值:變量用逗號(hào)分開,右邊的值會(huì)依次賦給左邊的變量。
n = 1
a, b = 10, 2*n
當(dāng)左右值的數(shù)量不一致時(shí):
變量個(gè)數(shù) > 值的個(gè)數(shù):按變量個(gè)數(shù)補(bǔ)足nil 變量個(gè)數(shù) < 值的個(gè)數(shù):多余的值會(huì)被忽略
點(diǎn)我快速測(cè)試下面的代碼
a, b, c = 0, 1
print(a,b,c)
--輸出0 1 nil
a, b = a+1, b+1, b+2
print(a,b)
--輸出1 2
a, b, c = 0
print(a,b,c)
--輸出0 nil nil
以下代碼,會(huì)輸出什么結(jié)果?
點(diǎn)我快速測(cè)試下面的代碼
a,b,c = 1,2,3
a,c = a+1,b
d = c,b
print(a,b,c,d)
交換變量
已知a和b的值,請(qǐng)?jiān)诮粨Q他們的值,使打印輸出12??34
點(diǎn)我快速測(cè)試下面的代碼
a = 34
b = 12
--你需要在這里進(jìn)行交換變量的操作
--提示:新建一個(gè)變量來(lái)存放臨時(shí)的值
--?[[ 借助臨時(shí)變量
c?=?a
a?=?b
b?=?c
--]]
--[[ 不借助臨時(shí)變量,lua風(fēng)格,簡(jiǎn)單直接
a,b?=?b,a
--]]
print(a,b)
輸出變量
點(diǎn)我快速測(cè)試下面的代碼
num = 123
--請(qǐng)補(bǔ)全代碼,輸出num的值
print(你要在這里填東西)
print(num)
算數(shù)運(yùn)算符
運(yùn)算符:告訴解釋器執(zhí)行特定的數(shù)學(xué)或邏輯運(yùn)算。
算術(shù)運(yùn)算符:
+ 加法
- 減法
* 乘法
/ 除法
% 取余,求出除法的余數(shù)
^ 乘冪,計(jì)算次方
- 負(fù)號(hào),取負(fù)值
點(diǎn)我快速測(cè)試下面的代碼
a = 21
b = 10
c = a + b
print('a + b 的值為 ', c ) -- 31
c = a - b
print('a - b 的值為 ', c ) -- 11
c = a * b
print('a * b 的值為 ', c ) -- 210
c = a / b
print('a / b 的值為 ', c ) -- 2.1
c = a % b
print('a % b 的值為 ', c ) -- 1
c = a^2
print('a^2 的值為 ', c ) -- 441.0
c = -a
print('-a 的值為 ', c ) -- -21
c = a * (b - a)
print('a * (b - a) 的值為 ', c ) -- -231
你需要完成下面的任務(wù):
長(zhǎng)方體的長(zhǎng)寬高為a、b、c(單位米),重量為m(單位克)
打印出物體的密度(單位g/m3)
注:密度計(jì)算公式 密度 = 質(zhì)量 / 體積
a,b,c = 1,2,3 --長(zhǎng)寬高
m = 10 --重量
--請(qǐng)打印出物體的密度
print(10/(1*2*3))
-- 1.6666666666667
字符串
string類型變量
字符串(string),一串文本數(shù)據(jù)。
Lua 三種表示方式:
單引號(hào) 雙引號(hào) [[ 和 ]]?
點(diǎn)我快速測(cè)試下面的代碼
--雙引號(hào)間的一串字符
str1 = "Lua"
--單引號(hào)間的一串字符
str2 = 'Lua'
--[[和]]--間的一串字符
str3 = [[Lua]]
str4 = [[使用雙括號(hào)時(shí),甚至能包含換行數(shù)據(jù)
換行了
最后一行]]
--輸出所有字符串
print(str1)
print(str2)
print(str3)
print(str4)
--[[
[10:27:31] Lua
[10:27:31] Lua
[10:27:31] Lua
[10:27:31] 使用雙括號(hào)時(shí),甚至能包含換行數(shù)據(jù)
換行了
最后一行
--]]
接下來(lái)你需要完成下面的練習(xí):
新建三個(gè)變量s1、s2、s3
分別存入字符串?dāng)?shù)據(jù):str、abc、233,使輸出打印正確
點(diǎn)我快速測(cè)試下面的代碼
--請(qǐng)?jiān)诳瞻滋幯a(bǔ)全代碼
s1 = "str"
s2 = 'abc'
s3 = [[233]]
print("s1,s2,s3的值:",s1,s2,s3)
print("s1,s2,s3的類型:",type(s1),type(s2),type(s3))
--[[
[10:30:26] s1,s2,s3的值: str abc 233
[10:30:26] s1,s2,s3的類型: string string string
--]]
轉(zhuǎn)義字符
如何輸出單引號(hào)和雙引號(hào)?如何輸出回車換行?
輸出單引號(hào)時(shí),用雙引號(hào)括起來(lái)
str = "'"
輸出雙引號(hào)時(shí),用單引號(hào)括起來(lái)
str = '"'
如何同時(shí)顯示單引號(hào)和雙引號(hào)?轉(zhuǎn)義字符。
轉(zhuǎn)義字符用于表示不能直接顯示的字符,如后退鍵、回車鍵、等。
以?\?開頭的都是轉(zhuǎn)義字符。常用的轉(zhuǎn)義字符:
轉(zhuǎn)義字符 含義 \n 換行(LF),將當(dāng)前位置移到下一行開頭 \r 回車(CR),將當(dāng)前位置移到本行開頭 \\ 反斜杠字符\ \‘ 單引號(hào) \“ 雙引號(hào) \0 空字符(NULL) \ddd 1到3位八進(jìn)制數(shù)所代表的任意字符 \xhh 1到2位十六進(jìn)制所代表的任意字符
給str賦值一個(gè)單引號(hào),一個(gè)雙引號(hào)(’”):
str = "\'\""
點(diǎn)我快速測(cè)試下面的代碼
--str = --補(bǔ)全代碼
str = "ab\\cd\"ef\'g\\h]]"
print(str)
--輸出應(yīng)為ab\cd"ef'g\h]]
string拼接
用..來(lái)表示字符串拼接:
點(diǎn)我快速測(cè)試下面的代碼
print('abc'..'def')
str1 = '123'
str2 = '999'
print(str1..str2)
--[10:59:07] abcdef
--[10:59:07] 123999
點(diǎn)我快速測(cè)試下面的代碼
s1,s2,s3 = "aaa","bbb","ccc"
--all = --請(qǐng)補(bǔ)全代碼
all = s1..s2..s3
print(all)
--[11:01:24] aaabbbccc
number轉(zhuǎn)string
把number類型的變量和string類型的變量拼接起來(lái),組成一個(gè)新的string
????????將number類型的變量n轉(zhuǎn)換成string類型的值,就可以拼接了。用tostring(value)函數(shù)
點(diǎn)我快速測(cè)試下面的代碼
n = 123
s = 'm/s'
result = tostring(n)..s
print(result)
--[11:03:23] 123m/s
下面你要完成這個(gè)任務(wù):
已知三個(gè)變量n1、s、n2
然后將他們按順序拼接起來(lái),存入變量result,使輸出結(jié)果正確
????????某些情況下,Lua會(huì)自動(dòng)將number類型轉(zhuǎn)換成string類型
點(diǎn)我快速測(cè)試下面的代碼
n1,s,n2 = 1,"abc",2
--result = --請(qǐng)補(bǔ)全代碼
result = n1..s..n2
print(result)
--[11:05:17] 1abc2
string轉(zhuǎn)number
變量s,存儲(chǔ)一個(gè)字符串,代表了一個(gè)數(shù)字,如何轉(zhuǎn)成number再與n相加計(jì)算呢?
將string類型的變量s轉(zhuǎn)換成number類型的值,就可以計(jì)算了。用tonumber(value)函數(shù)
點(diǎn)我快速測(cè)試下面的代碼
n = 123
s = '2333'
result = tonumber(s) + n
print(result)
--[11:07:27] 2456
下面你要完成這個(gè)任務(wù):
三個(gè)字符串變量s1、s2、s3,
計(jì)算他們的算術(shù)和,賦值給新建的變量result,使下面代碼輸出正確結(jié)果
點(diǎn)我快速測(cè)試下面的代碼
s1,s2,s3 = "11","12","100"
--result = --請(qǐng)補(bǔ)全代碼
result = tonumber(s1) + tonumber(s2) + tonumber(s3)
print(result)
--[11:10:14] 123
--result = s1 + s2 + s3 不可以
邏輯運(yùn)算
布爾型和比較運(yùn)算
布爾型(boolean)只有兩個(gè)可選值:true(真) 和?false(假)
Lua 把 false 和 nil 看作是false,其他的都為true(包括0這個(gè)值,相當(dāng)于true)
Lua 關(guān)系運(yùn)算符:
符號(hào) 含義 == 等于,檢測(cè)兩個(gè)值是否相等,相等返回 true,否則返回 false ~= 不等于,檢測(cè)兩個(gè)值是否相等,相等返回 false,否則返回 true > 大于,如果左邊的值大于右邊的值,返回 true,否則返回 false < 小于,如果左邊的值大于右邊的值,返回 false,否則返回 true >= 大于等于,如果左邊的值大于等于右邊的值,返回 true,否則返回 false <= 小于等于, 如果左邊的值小于等于右邊的值,返回 true,否則返回 false
點(diǎn)我快速測(cè)試下面的代碼
a = 21
b = 10
print('==的結(jié)果',a==b)
print('~=的結(jié)果',a~=b)
print('>的結(jié)果',a>b)
print('<的結(jié)果',a
print('>=的結(jié)果',a>=b)
print('<=的結(jié)果',a<=b)
--[[
[11:14:13] ==的結(jié)果 false
[11:14:13] ~=的結(jié)果 true
[11:14:13] >的結(jié)果 true
[11:14:13] <的結(jié)果 false
[11:14:13] >=的結(jié)果 true
[11:14:13] <=的結(jié)果 false
--]]
點(diǎn)我快速測(cè)試下面的代碼
a = 1
b = '1'
c = a
d = 2
print(a == b)
print(c == a)
print(a ~= b)
print(d <= c)
--[[
[11:15:40] false
[11:15:40] true
[11:15:40] true
[11:15:40] false
--]]
邏輯運(yùn)算符
邏輯運(yùn)算符基于布爾型的值來(lái)進(jìn)行計(jì)算。
?Lua 常用邏輯運(yùn)算符:
符號(hào) 含義 and 邏輯與操作符。 若 A 為 false,則返回 A,否則返回 B。不是返回 true/ false or 邏輯或操作符。 若 A 為 true,則返回 A,否則返回 B。不是返回 true/ false not 邏輯非操作符。與邏輯運(yùn)算結(jié)果相反,如果條件為 true,邏輯非為 false
點(diǎn)我快速測(cè)試下面的代碼
print('true and false的結(jié)果',true and false)
print('true or false的結(jié)果',true or false)
print('true and true的結(jié)果',true and true)
print('false or false的結(jié)果',false or false)
print('not false的結(jié)果',not false)
print('123 and 345的結(jié)果',123 and 345)
print('nil and true的結(jié)果',nil and true)
--[[
[11:20:22] true and false的結(jié)果 false
[11:20:22] true or false的結(jié)果 true
[11:20:22] true and true的結(jié)果 true
[11:20:22] false or false的結(jié)果 false
[11:20:22] not false的結(jié)果 true
[11:20:22] 123 and 345的結(jié)果 345 注意
[11:20:22] nil and true的結(jié)果 nil 注意
--]]
點(diǎn)我快速測(cè)試下面的代碼
a = 1
b = '1'
c = 0
print(a and b)
print(c or a)
print(not b)
print(d and c)
print(1 < 2 and 3 > 2)
--[[
[11:23:22] 1 注意
[11:23:22] 0 注意
[11:23:22] false
[11:23:22] nil 注意
[11:23:22] true
--]]
檢驗(yàn)大?。ㄗ詼y(cè)題)
已知number變量n,判斷n是否符合下面的條件:
3 正確的是? (返回true即表示變量n符合要求) 點(diǎn)我快速測(cè)試下面的代碼 n = 1--這個(gè)數(shù)可能是任意數(shù)字 print(n > 10 or n <= 3) print(n <= 10 or n > 3) print(n < 3 and n >= 10) --正確的 print(n <= 10 or n > 3) --[[ n = 1 [11:27:24] true 不對(duì) [11:27:24] true 不對(duì) [11:27:24] false [11:27:24] true 不對(duì) n = 8 [11:30:32] false 不對(duì) [11:30:32] true [11:30:32] false 不對(duì) [11:30:32] true n = 15 [11:30:54] true 不對(duì) [11:30:54] true 不對(duì) [11:30:54] false [11:30:54] true 不對(duì) --]] 分支判斷 條件判斷 if 條件 then 符合條件的代碼 end 下面是你需要完成的事: 已知變量n,請(qǐng)判斷n是否為奇數(shù),如果是,請(qǐng)給n的值加上1 求出n除以2的余數(shù):n % 2 給n的值加上1:n = n + 1 點(diǎn)我快速測(cè)試下面的代碼 --已知一個(gè)number變量n n = 5 --這個(gè)數(shù)字是幾都有可能 print("n在判斷前的值",n) --[[ if 你的條件 then 要做的事 end --]] if n % 2 == 1 then n = n + 1 end print("n在判斷后的值",n) --[[ [08:27:19] n在判斷前的值 5 [08:27:19] n在判斷后的值 6 --]] 多條件判斷 if 條件1 then 滿足條件1 elseif 條件2 then 不滿足條件1,但是滿足條件2 else 前面條件全都不滿足 end 點(diǎn)我快速測(cè)試下面的代碼 n = 1--更改這個(gè)數(shù)多運(yùn)行幾次試試 if n >= 0 and n < 5 then print('太小') elseif n >= 5 and n < 10 then print('適中') elseif n >= 10 then print('太大') end 注意:else和elseif都是可選的,可有可無(wú),但end不能省略 下面是你需要完成的事: 已知變量n,請(qǐng)判斷n是否為奇數(shù), 如果是,請(qǐng)給n的值加上1 如果不是,請(qǐng)將n的值改為原來(lái)的兩倍 點(diǎn)我快速測(cè)試下面的代碼 --已知一個(gè)number變量n n = 4 --這個(gè)數(shù)字是幾都有可能 print("n在判斷前的值",n) if n % 2 == 1 then n = n + 1 else n = n * 2 end print("n在判斷后的值",n) --[[ [10:07:04] n在判斷前的值 4 [10:07:04] n在判斷后的值 8 --]] 判斷三角形合法性(自測(cè)題) 三個(gè)number類型的變量a、b、c,分別代表三根木棒的長(zhǎng)度 用這三根木棒,是否可以組成一個(gè)三角形(兩短邊之和大于第三邊) 如果可以組成,就打印出true 如果不可以,就打印false a,b,c = 3,4,5--多改幾個(gè)數(shù)值自行測(cè)試 print("a=",a,"b=",b,"c=",c) if a+b>c and b+c>a and c+a>b then print("可以組成三角形",true) else print("不能組成三角形!",false) end print("判斷完成") --[[ [10:13:21] a= 3 b= 4 c= 5 [10:13:21] 可以組成三角形 true [10:13:21] 判斷完成 [10:14:18] a= 1 b= 2 c= 3 [10:14:18] 不能組成三角形! false [10:14:18] 判斷完成 [10:14:39] a= 5 b= 8 c= 6 [10:14:39] 可以組成三角形 true [10:14:39] 判斷完成 --]] if的判斷依據(jù)(自測(cè)題) Lua 把?false?和?nil?看作是false,其他的都為true(包括0這個(gè)值,相當(dāng)于true) 那么問(wèn)題來(lái)了,執(zhí)行下面的代碼,將會(huì)輸出什么? 點(diǎn)我快速測(cè)試下面的代碼 result = '' if 0 then result = result..'T,' else result = result..'F,' end if a then result = result..'T' else result = result..'F' end print(result) --[10:17:18] T,F 函數(shù) 初識(shí)函數(shù) 函數(shù):一段在一起的、可以做某一件事兒的程序,也叫子程序。 函數(shù)名(參數(shù)1,參數(shù)2,參數(shù)3,......) 很多事情都是重復(fù)性操作,用函數(shù),可以快速完成這些操作 函數(shù)名為hello,調(diào)用(執(zhí)行): 點(diǎn)我快速測(cè)試下面的代碼 function hello() print('Hello world!') end hello() --[10:19:43] Hello world! Lua中,函數(shù)也是一種變量類型,hello實(shí)際上也是一個(gè)變量,里面存儲(chǔ)一個(gè)函數(shù): 點(diǎn)我快速測(cè)試下面的代碼 function hello() print('Hello world!') end a = hello --把hello函數(shù)同時(shí)賦值給a變量 a() hello() --a和hello變量指向同一個(gè)函數(shù) --所以執(zhí)行結(jié)果和hello()相同 --[10:23:14] Hello world! --[10:23:14] Hello world! 可以這樣聲明hello函數(shù): 點(diǎn)我快速測(cè)試下面的代碼 hello = function() print('Hello world!') end hello() --[10:24:09] Hello world! 下面你需要做一件簡(jiǎn)單的事情: 新建一個(gè)函數(shù)變量biu,使其執(zhí)行后會(huì)打印biubiubiu這個(gè)字符串, 新建一個(gè)函數(shù)變量pong,使其與biu指向的函數(shù)相同 點(diǎn)我快速測(cè)試下面的代碼 --請(qǐng)?jiān)诖颂幯a(bǔ)全代碼 function biu( ) print("biubiubiu") end pong = biu --請(qǐng)使下面的調(diào)用可以正常打印出biubiubiu biu() pong() print("biu和pong相等嗎?",biu==pong) --[[ [10:26:24] biubiubiu [10:26:24] biubiubiu [10:26:24] biu和pong相等嗎? true --]] local變量 全局變量:在代碼運(yùn)行周期從頭到尾,都不會(huì)被銷毀,而且隨處都可調(diào)用。 局部變量:臨時(shí)使用、可以自動(dòng)銷毀釋放內(nèi)存資源的變量。 用local創(chuàng)建一個(gè)局部變量。 局部變量只在被聲明的那個(gè)代碼塊內(nèi)有效。 點(diǎn)我快速測(cè)試下面的代碼 a = 123 function add() local n = a+2 print(n) end add() print(n) --[10:29:14] 125 --[10:29:14] nil n是一個(gè)局部變量,只在這個(gè)funcion中有效,函數(shù)運(yùn)行完后會(huì)自動(dòng)回收這部分的內(nèi)存。 應(yīng)盡可能的使用局部變量,以方便lua虛擬機(jī)自動(dòng)回收內(nèi)存空間,減少資源占用提高運(yùn)行速度。 點(diǎn)我快速測(cè)試下面的代碼 str = 'abc' function connect() local s = str..'def' end print(s,str) --[10:31:40] nil abc 函數(shù)參數(shù) function 函數(shù)名(參數(shù)1,參數(shù)2,...) 代碼內(nèi)容 end 傳入的參數(shù),等價(jià)于在函數(shù)內(nèi)部新建了一個(gè)local的變量,修改這些數(shù)據(jù)不會(huì)影響外部的數(shù)據(jù)(除了table等類型) 點(diǎn)我快速測(cè)試下面的代碼 function add(a,b) print(a+b) end add(1,2) --會(huì)輸出3 等價(jià)于: 點(diǎn)我快速測(cè)試下面的代碼 function add() local a = 1 local b = 2 print(a+b) end add() 設(shè)計(jì)一個(gè)函數(shù)p,可以按下面的調(diào)用方式來(lái)打印出物體的密度: 點(diǎn)我快速測(cè)試下面的代碼 --補(bǔ)全這個(gè)函數(shù)的代碼,滿足題目要求 function p(a,b,c,m) print("密度為:", m/(a*b*c) ) end --一個(gè)長(zhǎng)方體的長(zhǎng)寬高分別為a、b、c(單位米) a = 1 b = 2 c = 3 --這個(gè)物體重量為m(單位克) m = 230 --下面打印出密度 --注:密度計(jì)算公式 密度 = 質(zhì)量 / 體積 p(a,b,c,m) --[10:39:59] 密度為: 38.333333333333 函數(shù)返回值 點(diǎn)我快速測(cè)試下面的代碼 function add(a,b) return a+b end all = add(1,2) --這里all的值就是3了 print(all) --[10:41:36] 3 return表示返回一個(gè)值,并且立刻結(jié)束這個(gè)函數(shù)的運(yùn)行 和輸入值可以有多個(gè)一樣,返回值也可以有多個(gè) 點(diǎn)我快速測(cè)試下面的代碼 function add(a,b) return a+b,"ok" end all, result = add(1,2) --這里all的值就是3了 --這里result的值就是string "ok" print(all,result) --[10:43:06] 3 ok 下面問(wèn)題來(lái)了,請(qǐng)?jiān)O(shè)計(jì)一個(gè)函數(shù)p,可以按下面的調(diào)用方式來(lái)返回出物體的密度,返回值為number類型: 點(diǎn)我快速測(cè)試下面的代碼 function p(a,b,c,m) --請(qǐng)補(bǔ)全代碼 return m/(a*b*c) end --一個(gè)長(zhǎng)方體的長(zhǎng)寬高分別為a、b、c(單位米) a = 1 b = 2 c = 3 --這個(gè)物體重量為m(單位克) m = 230 --下面返回密度值 --注:密度計(jì)算公式 密度 = 質(zhì)量 / 體積 result = p(a,b,c,m) print(result) --[10:45:00] 38.333333333333 判斷三角形合法性2(自測(cè)題) 你需要使用前面幾章的知識(shí),來(lái)完成下面的題目 已知三個(gè)number類型的變量,分別代表三根木棒的長(zhǎng)度 請(qǐng)判斷,使用這三根木棒,是否可以組成一個(gè)三角形(兩短邊之和大于第三邊) 請(qǐng)新建一個(gè)函數(shù)triangle,并可以用如下形式調(diào)用(如果可以組成,就返回true): 點(diǎn)我快速測(cè)試下面的代碼 function triangle(a,b,c) --請(qǐng)補(bǔ)全代碼 if a>b and a>c then --a是最長(zhǎng)邊 if b+c>a then print("可以組成三角形", b, "+", c, ">", a) return true else print("不能組成三角形", b, "+", c, "!>", a) return false end elseif b>a and b>c then --b是最長(zhǎng)邊 if a+c>b then print("可以組成三角形", a, "+", c, ">", b) return true else print("不能組成三角形", a, "+", c, "!>", b) return false end elseif c>b and c>a then --c是最長(zhǎng)邊 if a+b>c then print("可以組成三角形", a, "+", b, ">", c) return true else print("不能組成三角形", a, "+", b, "!>", c) return false end end end result = triangle(1,2,3)--傳入值為三邊長(zhǎng)度,多改幾個(gè)測(cè)試下 print(result) --[[ [11:01:02] 不能組成三角形 1 + 2 !>3 [11:01:02] false [11:02:23] 可以組成三角形 3 + 4 >5 [11:02:23] true [11:02:50] 可以組成三角形 7 + 9 >10 [11:02:50] true --]] 返回多個(gè)值(自測(cè)題) 已知長(zhǎng)方體的長(zhǎng)和寬 計(jì)算周長(zhǎng)和面積 新建函數(shù)rectangle,用如下形式調(diào)用: 點(diǎn)我快速測(cè)試下面的代碼 function rectangle(a,b) --補(bǔ)全代碼 return a*b, (a+b)*2 end area,len = rectangle(1,2) --結(jié)果: --面積area為2 --周長(zhǎng)len為6 print(area,len) --[11:05:35] 2 6 table 認(rèn)識(shí)數(shù)組 數(shù)組,用一個(gè)變量名,存儲(chǔ)一系列的值 Lua中,用table(表)來(lái)實(shí)現(xiàn) Lua中,table是一系列元素的集合,用大括號(hào)進(jìn)行表示,其中的元素間以逗號(hào)分隔: t = {1,3,8,5,4} 第一個(gè)元素的下標(biāo)是1,第二個(gè)是2,... 點(diǎn)我快速測(cè)試下面的代碼 t = {1,3,8,5,4} print(t[1]) --打印1 print(t[3]) --打印8 t[2] = 99 --更改第二個(gè)元素的值 print(t[2]) --打印99 t[6] = 2 --憑空新建第六個(gè)元素并賦值 print(t[6]) --打印2 print(t[10]) --因?yàn)椴淮嬖冢蛴il --[[ [11:57:35] 1 [11:57:35] 8 [11:57:35] 99 [11:57:35] 2 [11:57:35] nil --]] 以上是table當(dāng)作數(shù)組來(lái)用(一般語(yǔ)言中的數(shù)組基本都為不可變長(zhǎng)度,這里的table為可變長(zhǎng)度) 新建一個(gè)table,名為cards,存入1-10十個(gè)數(shù)字 將第3個(gè)元素與第7個(gè)元素交換 將第9個(gè)元素與第2個(gè)元素交換 增加第11個(gè)變量,值為23 cards = {1,2,3,4,5,6,7,8,9,10} print(cards[3],cards[7]) --打印第3,第7元素 cards[3],cards[7] = cards[7],cards[3] print(cards[3],cards[7]) --打印第3,第7元素 print(cards[2],cards[9]) --打印第2,第9元素 cards[2],cards[9] = cards[9],cards[2] print(cards[2],cards[9]) --打印第2,第9元素 cards[11] = 23 print(cards[11]) --打印第11元素 print(cards[12]) --因?yàn)椴淮嬖?,打印nil --[[ [12:04:38] 3 7 [12:04:38] 7 3 [12:04:38] 2 9 [12:04:38] 9 2 [12:04:38] 23 [12:04:38] nil --]] 簡(jiǎn)單table table中可以包括任意類型的數(shù)據(jù) t = {"abc",223,",..a",123123} 能在里面放function變量 點(diǎn)我快速測(cè)試下面的代碼 t = { function() return 123 end, function() print("abc") end, function(a,b) return a+b end, function() print("hello world") end, } t[1]() t[2]() t[3](1,2) t[4]() --[12:06:49] abc --[12:06:49] hello world 這些table訪問(wèn)每個(gè)元素的方式仍然是直接用下標(biāo),也能用下標(biāo)來(lái)進(jìn)行修改 下面你需要完成: 新建一個(gè)table,名為funcList,并實(shí)現(xiàn)以下功能 調(diào)用funcList[1](a,b),返回a和b的乘積 調(diào)用funcList[2](a,b),返回a減b的差 調(diào)用funcList[3](a),返回a的相反數(shù)(-a) 點(diǎn)我快速測(cè)試下面的代碼 --請(qǐng)補(bǔ)全代碼 funcList = { function(a,b) return a*b end, function(a,b) return a-b end, function(a) return -a end } a,b = 1,2--提供兩個(gè)數(shù) print("a,b值為",a,b) print("a和b的乘積:",funcList[1](a,b)) print("a和b的差:",funcList[2](a,b)) print("a和相反數(shù):",funcList[3](a)) --[[ [12:09:33] a,b值為 1 2 [12:09:33] a和b的乘積: 2 [12:09:33] a和b的差: -1 [12:09:33] a和相反數(shù): -1 --]] table下標(biāo) 前兩節(jié),table都只是一些簡(jiǎn)單的List(列表),每個(gè)元素的下標(biāo)都是自動(dòng)從1排列的 Lua中,下標(biāo)可以直接在聲明時(shí)進(jìn)行指定: 點(diǎn)我快速測(cè)試下面的代碼 t = {6,7,8,9} --上面和下面的代碼等價(jià) t = { [1] = 6, [2] = 7, [3] = 8, [4] = 9, } --甚至你可以跳過(guò)某些下標(biāo) t = { [1] = 6, [3] = 7, [5] = 8, [7] = 9, } print(t[7]) --輸出9 --在聲明后賦予元素值也是可以的 t = {}--空的table t[101] = 10 print(t[101]) --輸出10 需要: 新建一個(gè)變量t,并按下面的格式聲明 下標(biāo)為1的元素,值為123(number) 下標(biāo)為13的元素,值為"abc"(string) 下標(biāo)為666的元素,值為"666"(string) 點(diǎn)我快速測(cè)試下面的代碼 --請(qǐng)補(bǔ)全代碼 t = { [1] = 123, [13] = "abc", [666] = "666" } print("下標(biāo)為1的元素:",t[1],type(t[1])) print("下標(biāo)為13的元素:",t[13],type(t[13])) print("下標(biāo)為666的元素:",t[666],type(t[666])) --[[ [12:14:15] 下標(biāo)為1的元素: 123 number [12:14:15] 下標(biāo)為13的元素: abc string [12:14:15] 下標(biāo)為666的元素: 666 string --]] 下標(biāo)進(jìn)階 自定義下標(biāo):在Lua中,下標(biāo)也可以是字符串: 點(diǎn)我快速測(cè)試下面的代碼 t = { ["apple"] = 10, banana = 12, pear = 6, } --使用["下標(biāo)"] = 值 --和 下標(biāo) = 值 --都是正確寫法 --當(dāng)?shù)诙N方式有歧義時(shí),應(yīng)該用第一種方式 --可以用下面兩種方式訪問(wèn): print(t["apple"]) --輸出10 print(t.apple) --輸出10 --當(dāng)?shù)诙N方式有歧義時(shí),應(yīng)該用第一種方式 --[[ [12:16:09] 10 [12:16:09] 10 --]] 用string作為下標(biāo)時(shí),table的靈活性提升了一個(gè)數(shù)量級(jí)。 string作為下標(biāo)時(shí),也可以動(dòng)態(tài)賦值: 點(diǎn)我快速測(cè)試下面的代碼 t = {} -- 空table t["new"] = "新的值" print(t.new) --輸出 新的值 --[12:17:22] 新的值 完成: 新建table變量t 下標(biāo)為apple的元素,值為123(number) 下標(biāo)為banana的元素,值為"abc"(string) 下標(biāo)為1@1的元素,值為"666"(string) 點(diǎn)我快速測(cè)試下面的代碼 --請(qǐng)補(bǔ)全代碼 t = { apple = 123, ["banana"] = "abc", ["1@1"] = "666" } print("下標(biāo)為apple的元素:",t["apple"],type(t["apple"])) print("下標(biāo)為banana的元素:",t["banana"],type(t["banana"])) print("下標(biāo)為1@1的元素:",t["1@1"],type(t["1@1"])) --[[ [12:21:08] 下標(biāo)為apple的元素: 123 number [12:21:08] 下標(biāo)為banana的元素: abc string [12:21:08] 下標(biāo)為1@1的元素: 666 string --]] table小測(cè)驗(yàn) 下面的代碼,將會(huì)打印什么? 點(diǎn)我快速測(cè)試下面的代碼 t = { apple = { price = 7.52, weight = 2.1, }, banana = { price = 8.31, weight = 1.4, year = '2018' }, year = '2019' } print( t.price, t.apple.price, t.banana.weight, t.year ) --[12:23:04] nil 7.52 1.4 2019 table小測(cè)驗(yàn)2 下面的代碼,將會(huì)打印什么? 點(diǎn)我快速測(cè)試下面的代碼 t = { { price = 7.52, weight = 2.1, }, { price = 8.31, weight = 1.4, year = '2018' }, year = '2019' } print( t["price"], t[1].price, t[2].weight, t["year"] ) --[12:24:14] nil 7.52 1.4 2019 Lua全局變量與table 在table中,可以直接用table名[下標(biāo)]或table名.string下標(biāo)來(lái)訪問(wèn)元素 Lua中,所有的全局變量全部被存放在了一個(gè)大table中,這個(gè)table名為:_G 點(diǎn)我快速測(cè)試下面的代碼 n = 123--新建變量 print(n)--輸出123 print(_G.n)--輸出123 _G.abc = 1--相當(dāng)于新建全局變量 print(abc)--輸出1 _G["def"] = 23--相當(dāng)于新建全局變量 print(def)--輸出23 --甚至你可以像下面這樣 _G.print("hello") _G["print"]("world") --[[ [12:26:14] 123 [12:26:14] 123 [12:26:14] 1 [12:26:14] 23 [12:26:14] hello [12:26:14] world --]] 現(xiàn)在,你明白為什么說(shuō)萬(wàn)物基于table了吧? 任務(wù): 已知有一個(gè)全局變量,名為@#$ 請(qǐng)新建一個(gè)變量result 將@#$變量里的值賦值給result 點(diǎn)我快速測(cè)試下面的代碼 _G["@#$"] = 123 --result = @#$ --請(qǐng)補(bǔ)全代碼,錯(cuò)誤,不符合標(biāo)識(shí)符命名規(guī)則 result = _G["@#$"] --請(qǐng)補(bǔ)全代碼 print("result值為",result) --[12:28:48] result值為 123 table小測(cè)試3 請(qǐng)新建一個(gè)名為t的table,滿足以下要求 t[10]可獲得number類型數(shù)據(jù)100 t.num可獲得number類型數(shù)據(jù)12 t.abc[3]可獲得string類型數(shù)據(jù)abcd t.a.b.c可獲得number類型數(shù)據(jù)789 點(diǎn)我快速測(cè)試下面的代碼 --請(qǐng)補(bǔ)全代碼 t = { [10] = 100, num = 12, abc = { [3] = "abcd" }, a = { b = { c = 789 } } } print("t[10]可獲得number類型數(shù)據(jù)100:",t[10],type(t[10])) print("t.num可獲得number類型數(shù)據(jù)12:",t.num,type(t.num)) print("t.abc[3]可獲得string類型數(shù)據(jù)abcd:",t.abc[3],type(t.abc[3])) print("t.a.b.c可獲得number類型數(shù)據(jù)789:",t.a.b.c,type(t.a.b.c)) --[[ [13:17:17] t[10]可獲得number類型數(shù)據(jù)100: 100 number [13:17:17] t.num可獲得number類型數(shù)據(jù)12: 12 number [13:17:17] t.abc[3]可獲得string類型數(shù)據(jù)abcd: abcd string [13:17:17] t.a.b.c可獲得number類型數(shù)據(jù)789: 789 number --]] table.concat table.concat (table [, sep [, i [, j ] ] ]) 將元素是string或number類型的table,每個(gè)元素連接起來(lái)變成字符串并返回。 可選參數(shù)sep,表示連接的間隔符,默認(rèn)為空。 i和j表示元素起始和結(jié)束的下標(biāo)。 點(diǎn)我快速測(cè)試下面的代碼 local a = {1, 3, 5, "hello" } print(table.concat(a)) print(table.concat(a, "|")) -->打印的結(jié)果: --135hello --1|3|5|hello 請(qǐng)完成下面的任務(wù): 已知table變量t, 將t中的結(jié)果全部連起來(lái) 間隔符使用, 并使用print打印出來(lái) 點(diǎn)我快速測(cè)試下面的代碼 t = {"a","b","c","d"} print("連接結(jié)果:") --補(bǔ)全代碼 str = table.concat (t) print("連接結(jié)果:",str) --[13:23:19] 連接結(jié)果: --[13:23:19] 連接結(jié)果: abcd table刪減 table.insert (table, [pos ,] value) 在(數(shù)組型)表 table 的 pos 索引位置插入 value,其它元素向后移動(dòng)。pos 的默認(rèn)值是表的長(zhǎng)度加一,即默認(rèn)是插在表的最后。 table.remove (table [, pos]) 在表 table 中刪除索引為 pos(pos 只能是 number 型)的元素,并返回這個(gè)被刪除的元素,它后面所有元素的索引值都會(huì)減一。pos 的默認(rèn)值是表的長(zhǎng)度,即默認(rèn)是刪除表的最后一個(gè)元素。 點(diǎn)我快速測(cè)試下面的代碼 local a = {1, 8} --a[1] = 1,a[2] = 8 table.insert(a, 1, 3) --在表索引為1處插入3 print(a[1], a[2], a[3]) table.insert(a, 10) --在表的最后插入10 print(a[1], a[2], a[3], a[4]) -->打印的結(jié)果: --3 1 8 --3 1 8 10 local a = { 1, 2, 3, 4} print(table.remove(a, 1)) --刪除速索引為1的元素 print(a[1], a[2], a[3], a[4]) print(table.remove(a)) --刪除最后一個(gè)元素 print(a[1], a[2], a[3], a[4]) -->打印的結(jié)果: --1 --2 3 4 nil --4 --2 3 nil nil 請(qǐng)完成下面的任務(wù): 已知table變量t, 去除t中的第一個(gè)元素 然后這時(shí),在t的第三個(gè)元素前,加上一個(gè)number變量,值為810 點(diǎn)我快速測(cè)試下面的代碼 t = {1,2,3,4,5,6,7,8,9} --補(bǔ)全代碼 print(table.remove(t, 1)) --刪除速索引為1的元素 table.insert(t, 3, 810) --在表索引為3處,插入810 print("第一個(gè)元素應(yīng)為2:",t[1]) print("第三個(gè)元素應(yīng)為810:",t[3]) --[[ [15:58:43] 1 [15:58:43] 第一個(gè)元素應(yīng)為2: 2 [15:58:43] 第三個(gè)元素應(yīng)為810: 810 --]] 循環(huán) while循環(huán) while 繼續(xù)循環(huán)判斷依據(jù) do 執(zhí)行的代碼 end 計(jì)算從1加到100的結(jié)果: 點(diǎn)我快速測(cè)試下面的代碼 local result = 0 local num = 1 while num <= 100 do result = result + num num = num + 1 end print(result) --5050 任務(wù): 已知兩個(gè)number類型的變量min和max 請(qǐng)計(jì)算從min與max之間,所有3的倍數(shù)的和 打印出結(jié)果 點(diǎn)我快速測(cè)試下面的代碼 min,max = 114,514 --這個(gè)結(jié)果應(yīng)為42009 result = 0--結(jié)果存放到這個(gè)變量 --[[ while 請(qǐng)完善 do --補(bǔ)全代碼 end --]] while min<=max do if min % 3 == 0 then result = result + min end min = min + 1 end print("結(jié)果:",result) --[16:05:29] 結(jié)果: 42009 for循環(huán) for循環(huán)更加簡(jiǎn)潔地表達(dá)中間累積的量 for 臨時(shí)變量名=開始值,結(jié)束值,步長(zhǎng) do 循環(huán)的代碼 end 步長(zhǎng)可以省略,默認(rèn)為1 臨時(shí)變量名可以直接在代碼區(qū)域使用(但不可更改),每次循環(huán)會(huì)自動(dòng)加步長(zhǎng)值,并且在到達(dá)結(jié)束值后停止循環(huán) 計(jì)算從1加到100的結(jié)果: 點(diǎn)我快速測(cè)試下面的代碼 local result = 0 for i=1,100 do result = result + i end print(result) --5050 當(dāng)i≤100時(shí),result不斷地加i,并且i每次循環(huán)后增加1 任務(wù): 已知兩個(gè)number類型的變量min和max 請(qǐng)計(jì)算從min與max之間,所有7的倍數(shù)的和 打印出結(jié)果 點(diǎn)我快速測(cè)試下面的代碼 min,max = 114,514 --這個(gè)結(jié)果應(yīng)為17955 result = 0--結(jié)果存放到這個(gè)變量 --for --補(bǔ)全代碼 for m = 114, 514, 1 do if m % 7 == 0 then result = result + m end end print("結(jié)果:",result) --[16:11:35] 結(jié)果: 17955 中斷循環(huán) 在循環(huán)體中用break,立即結(jié)束本次循環(huán),繼續(xù)運(yùn)行下面的代碼 計(jì)算1-100相加途中,小于100的最大的和: 點(diǎn)我快速測(cè)試下面的代碼 result = 0 for i=1,100 do result = result + i if result > 100 then result = result - i break end end print(result) --91 當(dāng)發(fā)現(xiàn)和大于100后,代碼立即把result的值還原到了加上當(dāng)前數(shù)字之前的狀態(tài),并且調(diào)用break語(yǔ)句,立即退出了本次循環(huán) 在while中也可以使用break: 點(diǎn)我快速測(cè)試下面的代碼 result = 0 c = 1 while true do result = result + c if result > 100 then result = result - c break end c = c + 1 end print(result) --91 我們?cè)谶@里直接使用了死循環(huán)(因?yàn)閣hile的繼續(xù)運(yùn)行判斷依據(jù)始終為true),整體邏輯也和之前for的代碼一致,當(dāng)發(fā)現(xiàn)和大于100后,代碼立即把result的值還原到了加上當(dāng)前數(shù)字之前的狀態(tài),并且調(diào)用break語(yǔ)句,立即退出了本次循環(huán) 現(xiàn)在你需要完成一項(xiàng)任務(wù): 請(qǐng)求出小于變量max的13的倍數(shù)的最大值(max大于0) 并將結(jié)果打印出來(lái) 用for循環(huán)實(shí)現(xiàn) 點(diǎn)我快速測(cè)試下面的代碼 max = 810 --結(jié)果應(yīng)為806 result = 0 --for --請(qǐng)補(bǔ)全代碼 for x = 810, 0, -1 do if x % 13 == 0 then result = x break end end print(result) --806 循環(huán)測(cè)試題1(自測(cè)題) print函數(shù)可以打印一行完整的輸出 那么,已知變量a,請(qǐng)打印出下面的結(jié)果: (a為大于0的整數(shù),且需要輸出a行數(shù)據(jù),數(shù)據(jù)從1開始,每行與上一行的差為2) 1 3 5 7 9 (上面例子為當(dāng)a為5的情況) 做題區(qū)域: 點(diǎn)我快速測(cè)試下面的代碼 a = 10 --需要用print輸出要求的結(jié)果 print("輸出結(jié)果:") --for --請(qǐng)補(bǔ)全代碼 for x = 1, a, 1 do if x % 2 == 1 then print(x) end end --[[ [16:27:18] 輸出結(jié)果: [16:27:18] 1 [16:27:18] 3 [16:27:18] 5 [16:27:18] 7 [16:27:18] 9 --]] 循環(huán)測(cè)試題2(自測(cè)題) 已知變量a,請(qǐng)打印出下面的結(jié)果: (a為大于0的整數(shù),且需要輸出a行數(shù)據(jù),第一行為一個(gè)*,后面每行多一個(gè)*) * ** *** **** ***** (上面例子為當(dāng)a為5的情況) 做題區(qū)域: 點(diǎn)我快速測(cè)試下面的代碼 a = 10 --需要用print輸出要求的結(jié)果 print("輸出結(jié)果:") str = "" --for --請(qǐng)補(bǔ)全代碼 for m = 1, 10, 1 do str = str.."*" print(m, str) end --[[ [16:30:46] 輸出結(jié)果: [16:30:46] 1 * [16:30:46] 2 ** [16:30:46] 3 *** [16:30:46] 4 **** [16:30:46] 5 ***** [16:30:46] 6 ****** [16:30:46] 7 ******* [16:30:46] 8 ******** [16:30:46] 9 ********* [16:30:46] 10 ********** --]] 循環(huán)測(cè)試題3(自測(cè)題) 我們需要完成下面的任務(wù) 那么,已知變量a,請(qǐng)打印出下面的結(jié)果: (a為大于0的整數(shù),且需要輸出a行數(shù)據(jù),按圖示規(guī)律輸出) 1 12 123 1234 12345 123456 1234567 12345678 123456789 12345678910 1234567891011 (上面例子為當(dāng)a為11的情況) 做題區(qū)域: 點(diǎn)我快速測(cè)試下面的代碼 a = 13 --需要用print輸出要求的結(jié)果 print("輸出結(jié)果:") str = "" --for --請(qǐng)補(bǔ)全代碼 for m = 1, a, 1 do str = str..m print(str) end --[[ [16:33:53] 輸出結(jié)果: [16:33:53] 1 [16:33:53] 12 [16:33:53] 123 [16:33:53] 1234 [16:33:53] 12345 [16:33:53] 123456 [16:33:53] 1234567 [16:33:53] 12345678 [16:33:53] 123456789 [16:33:53] 12345678910 [16:33:53] 1234567891011 [16:33:53] 123456789101112 [16:33:53] 12345678910111213 --]] 循環(huán)測(cè)試題4(自測(cè)題) 有一只猴子,第一天摘了若干個(gè)桃子 ,當(dāng)即吃了一半,但還覺得不過(guò)癮 ,就又多吃了一個(gè)。 第2天早上又將剩下的桃子吃掉一半,還是覺得不過(guò)癮,就又多吃了兩個(gè)。 以后每天早上都吃了前一天剩下的一半加天數(shù)個(gè)(例如,第5天吃了前一天剩下的一半加5個(gè))。 到第n天早上再想吃的時(shí)候,就只剩下一個(gè)桃子了。 那么,已知變量a為最后一天的天數(shù),請(qǐng)打印出第一天的桃子數(shù)。 如:a為5時(shí),輸出114 做題區(qū)域: 點(diǎn)我快速測(cè)試下面的代碼 a = 6 --需要用print輸出要求的結(jié)果 print("輸出結(jié)果:") for --請(qǐng)補(bǔ)全代碼 詳解string庫(kù) string.sub string庫(kù)的各種接口 string.sub(s, i [, j]) 返回字符串?s?中,從索引?i?到索引?j?之間的子字符串。 i 可以為負(fù)數(shù),表示倒數(shù)第幾個(gè)字符。 當(dāng) j 缺省時(shí),默認(rèn)為 -1,即字符串 s 的最后位置。 當(dāng)索引 i 在字符串 s 的位置在索引 j 的后面時(shí),將返回一個(gè)空字符串。 點(diǎn)我快速測(cè)試下面的代碼 print(string.sub("Hello Lua", 4, 7)) print(string.sub("Hello Lua", 2)) print(string.sub("Hello Lua", 2, 1)) print(string.sub("Hello Lua", -3, -1)) -->打印的結(jié)果: lo L ello Lua Lua 值得注意的是,我們可以使用冒號(hào)來(lái)簡(jiǎn)化語(yǔ)法,像下面這樣: 點(diǎn)我快速測(cè)試下面的代碼 s = "12345" s1 = string.sub(s, 4, 7) s2 = s:sub(4, 7) --兩種寫法是等價(jià)關(guān)系 print(s1,s2) 請(qǐng)完成下面的任務(wù): 已知字符串變量s,請(qǐng)分別打印出(每種一行): s從第4個(gè)字符開始,到最后的值 s從第1個(gè)字符開始,到倒數(shù)第3個(gè)字符的值 s從倒數(shù)第5個(gè)字符開始,到倒數(shù)第2個(gè)字符的值 點(diǎn)我快速測(cè)試下面的代碼 s = "1919810" --補(bǔ)全代碼 print() print() print() string.rep string.rep(s, n) 返回字符串 s 的 n 次拷貝。 示例代碼: 點(diǎn)我快速測(cè)試下面的代碼 print(string.rep("abc", 3)) --輸出結(jié)果: --abcabcabc 請(qǐng)完成下面的任務(wù): 打印一行數(shù)據(jù),數(shù)據(jù)內(nèi)容為810個(gè)114514 點(diǎn)我快速測(cè)試下面的代碼 --補(bǔ)全代碼 print() string.len string.len(s) 接收一個(gè)字符串,返回它的長(zhǎng)度。 點(diǎn)我快速測(cè)試下面的代碼 s = "hello lua" print(string.len(s)) --輸出結(jié)果: 9 --同時(shí)也可以使用簡(jiǎn)便語(yǔ)法 print(s:len()) 請(qǐng)完成下面的任務(wù): 新建一個(gè)變量s,使數(shù)據(jù)內(nèi)容為810個(gè)114514 并打印出字符串s的長(zhǎng)度 點(diǎn)我快速測(cè)試下面的代碼 s = --補(bǔ)全代碼 print() 大小寫轉(zhuǎn)換 string.lower(s) 接收一個(gè)字符串 s,返回一個(gè)把所有大寫字母變成小寫字母的字符串。 string.upper(s) 接收一個(gè)字符串 s,返回一個(gè)把所有小寫字母變成大寫字母的字符串。 示例代碼: 點(diǎn)我快速測(cè)試下面的代碼 s = "hello lua" print(string.upper(s)) print(string.lower(s)) --輸出結(jié)果: HELLO LUA hello lua --同時(shí)也可以使用簡(jiǎn)便語(yǔ)法 print(s:upper()) print(s:lower()) 請(qǐng)完成下面的任務(wù): 已知一個(gè)變量s,打印出全是大寫字母的s字符串 點(diǎn)我快速測(cè)試下面的代碼 s = "asd8938KJjsidiajdl;(()k)" print --補(bǔ)全代碼 string.format string.format(formatstring, …) 按照格式化參數(shù)formatstring,返回后面...內(nèi)容的格式化版本。 編寫格式化字符串的規(guī)則與標(biāo)準(zhǔn) c 語(yǔ)言中 printf 函數(shù)的規(guī)則基本相同: 它由常規(guī)文本和指示組成,這些指示控制了每個(gè)參數(shù)應(yīng)放到格式化結(jié)果的什么位置,及如何放入它們。 一個(gè)指示由字符%加上一個(gè)字母組成,這些字母指定了如何格式化參數(shù),例如d用于十進(jìn)制數(shù)、x用于十六進(jìn)制數(shù)、o用于八進(jìn)制數(shù)、f用于浮點(diǎn)數(shù)、s用于字符串等。 示例代碼: 點(diǎn)我快速測(cè)試下面的代碼 print(string.format("%.4f", 3.1415926)) -- 保留4位小數(shù) print(string.format("%d %x %o", 31, 31, 31))-- 十進(jìn)制數(shù)31轉(zhuǎn)換成不同進(jìn)制 d,m,y = 29,7,2015 print(string.format("%s %02d/%02d/%d", "today is:", d, m, y)) --控制輸出2位數(shù)字,并在前面補(bǔ)0 -->輸出 -- 3.1416 -- 31 1f 37 -- today is: 29/07/2015 請(qǐng)完成下面的任務(wù): 已知一個(gè)變量n,為number類型整數(shù) 打印出n:連上n值的字符串 點(diǎn)我快速測(cè)試下面的代碼 n = 810 print --補(bǔ)全代碼 string的本質(zhì) 這一節(jié)我們來(lái)講解字符串的本質(zhì) 字符串,是用來(lái)存儲(chǔ)一串字符的,但是它的本質(zhì)就是一串?dāng)?shù)字。如何用一串?dāng)?shù)字來(lái)代表一串字符呢? 在計(jì)算機(jī)中,每一個(gè)符號(hào)都對(duì)應(yīng)著一個(gè)數(shù)字,但是在講解這個(gè)知識(shí)之前,我們了解一下補(bǔ)充知識(shí): 在大多數(shù)編程語(yǔ)言中,我們使用0x開頭來(lái)表示這個(gè)數(shù)字是16進(jìn)制的。 比如 10等價(jià)于0x0a 256等價(jià)于0xff 接下來(lái),你需要了解,每一個(gè)符號(hào)都對(duì)應(yīng)著一個(gè)數(shù)字,比如: 0對(duì)應(yīng)著0x30、1對(duì)應(yīng)著0x31?a對(duì)應(yīng)著0x61、b對(duì)應(yīng)著0x62?A對(duì)應(yīng)著0x41、B對(duì)應(yīng)著0x42 上面的編碼規(guī)則,我們稱之為ascii碼,具體想了解可以打開下面的網(wǎng)址查看: ASCII編碼對(duì)照表_911查詢 當(dāng)然,1字節(jié)最大為0xff,即256,只能存下一部分符號(hào),大部分的中文按某些編碼,一個(gè)中文占用2或3個(gè)字節(jié) 計(jì)算機(jī)如何解析這些數(shù)據(jù),我們不需要了解,當(dāng)你知道了上面的知識(shí)后,你應(yīng)該可以理解下面的描述: 字符串"apple"實(shí)際上的內(nèi)容就是下面的一串?dāng)?shù)字: 0x61,0x70,0x70,0x6c,0x65 同時(shí),lua的字符串中可以保存任何數(shù)值,即使是0x00這種不代表任何含義的數(shù),也可以保存 補(bǔ)充:在其他語(yǔ)言中(如C),0x00代表字符串結(jié)束,但是在lua中并不是這樣。 lua的字符串每字節(jié)可以存儲(chǔ)任意的一字節(jié)數(shù)據(jù)。 比如下面的描述: 有一串lua字符串中的數(shù)據(jù)為: 0x01,0x02,0x30,0x00,0x44 實(shí)際人能看到的(不可見字符用?代替): ??0?D 當(dāng)然,你不能說(shuō)你看不見的數(shù)據(jù)就不存在,他們都完好無(wú)損地在這個(gè)字符串中 下面你需要思考一個(gè)問(wèn)題:一串字符串?dāng)?shù)據(jù)如下,它的實(shí)際內(nèi)容是什么(指人能看見的字符串內(nèi)容,如abcd)? 0x62,0x61,0x6e,0x61,0x6e,0x61 string.char string.char (…) 接收 0 個(gè)或更多的整數(shù)(整數(shù)范圍:0~255),返回這些整數(shù)所對(duì)應(yīng)的 ASCII 碼字符組成的字符串。當(dāng)參數(shù)為空時(shí),默認(rèn)是一個(gè) 0。 如果上一章節(jié)有認(rèn)真學(xué)習(xí)過(guò)了的話,這段話應(yīng)該是很好理解的。實(shí)質(zhì)上就是把計(jì)算機(jī)認(rèn)識(shí)的一串?dāng)?shù)字,變成字符串變量,并且字符串內(nèi)的數(shù)據(jù)就是要存的那串?dāng)?shù)據(jù)。 示例代碼: 點(diǎn)我快速測(cè)試下面的代碼 str1 = string.char(0x30,0x31,0x32,0x33) str2 = string.char(0x01,0x02,0x30,0x03,0x44) print(str1) print(str2) -->輸出(不可見字符用?代替) --0123 --??0?D 請(qǐng)完成下面的任務(wù): 已知一個(gè)字符串的每個(gè)字符在數(shù)組t中按順序排列 請(qǐng)根據(jù)t的值,打印出字符串內(nèi)容(一行數(shù)據(jù)) 注:這個(gè)字符串存儲(chǔ)的不一定是可見的字符 點(diǎn)我快速測(cè)試下面的代碼 t = {0x79,0x6F,0x75,0x20,0x61,0x72,0x65,0x20,0x72,0x69,0x67,0x68,0x74} print("真正的字符串內(nèi)容:") --補(bǔ)全代碼 string.byte string.byte(s [, i [, j ] ]) 返回字符 s[i]、s[i + 1]、s[i + 2]、······、s[j] 所對(duì)應(yīng)的 ASCII 碼。i 的默認(rèn)值為 1,即第一個(gè)字節(jié),j 的默認(rèn)值為 i 。 這個(gè)函數(shù)功能剛好和前面的string.char相反,是提取字符串中實(shí)際的數(shù)值。 示例代碼: 點(diǎn)我快速測(cè)試下面的代碼 str = "12345" print(string.byte(str,2)) print(str:byte(2))--也可以這樣 print(str:byte())--不填默認(rèn)是1 -->輸出(十進(jìn)制數(shù)據(jù)) --50 --50 --49 請(qǐng)完成下面的任務(wù): 已知字符串s 請(qǐng)把s中代表的數(shù)據(jù),全部相加,并打印出來(lái) 點(diǎn)我快速測(cè)試下面的代碼 s = string.char(1,2,3,4,5,6,7,8,9) print("s內(nèi)數(shù)據(jù)的和是:") --補(bǔ)全代碼 string.find string.find(s, p [, init [, plain] ]) 這個(gè)函數(shù)會(huì)在字符串s中,尋找匹配p字符串的數(shù)據(jù)。如果成功找到,那么會(huì)返回p字符串在s字符串中出現(xiàn)的開始位置和結(jié)束位置;如果沒(méi)找到,那么就返回nil。 第三個(gè)參數(shù)init默認(rèn)為1,表示從第幾個(gè)字符開始匹配,當(dāng)init為負(fù)數(shù)時(shí),表示從s字符串的倒數(shù)第-init個(gè)字符處開始匹配。 第四個(gè)參數(shù)plain默認(rèn)為false,當(dāng)其為true時(shí),只會(huì)把p看成一個(gè)字符串對(duì)待。 可能你會(huì)奇怪,第四個(gè)參數(shù)有什么存在的必要嗎?p不是本來(lái)就應(yīng)該是個(gè)字符串嗎? 實(shí)際上,lua中的匹配默認(rèn)意義是正則匹配,同時(shí),這里的正則與其它語(yǔ)言也有些許不同。 由于篇幅有限,本節(jié)和下面的幾節(jié)涉及匹配內(nèi)容時(shí),均不會(huì)考慮正則的使用方法,Lua正則教程將會(huì)在最后幾節(jié)單獨(dú)詳細(xì)地列出來(lái)。 第四個(gè)參數(shù)為true時(shí),便不會(huì)使用正則功能。 示例代碼: 點(diǎn)我快速測(cè)試下面的代碼 --只會(huì)匹配到第一個(gè) print(string.find("abc abc", "ab")) -- 從索引為2的位置開始匹配字符串:ab print(string.find("abc abc", "ab", 2)) -- 從索引為5的位置開始匹配字符串:ab print(string.find("abc abc", "ab", -3)) -->輸出 --1 2 --5 6 --5 6 請(qǐng)完成下面的任務(wù): 已知字符串s,里面有很多相同的字符串 請(qǐng)找出字符串s中,所有字符串a(chǎn)wsl的位置 使用print打印結(jié)果,結(jié)果一行一個(gè) 如字符串12awslawslaw,輸出3和7 點(diǎn)我快速測(cè)試下面的代碼 s = "12awsaslwlaawsllslllswasllalssawwlawslaw" print("兩個(gè)awsl的位置分別是:") --補(bǔ)全代碼 string.gsub string.gsub(s, p, r [, n]) 將目標(biāo)字符串s中所有的子串p替換成字符串r。 可選參數(shù)n,表示限制替換次數(shù)。 返回值有兩個(gè),第一個(gè)是被替換后的字符串,第二個(gè)是替換了多少次。 特別提示:這個(gè)函數(shù)的目標(biāo)字符串s,也是支持正則的 下面是例子: 點(diǎn)我快速測(cè)試下面的代碼 print(string.gsub("Lua Lua Lua", "Lua", "hello")) print(string.gsub("Lua Lua Lua", "Lua", "hello", 2)) --指明第四個(gè)參數(shù) -->打印的結(jié)果: -- hello hello hello 3 -- hello hello Lua 2 同樣的,我們也可以使用冒號(hào)來(lái)簡(jiǎn)化語(yǔ)法,像下面這樣: 點(diǎn)我快速測(cè)試下面的代碼 s = "12345" r = s:gsub("2","b") print(r) 請(qǐng)完成下面的任務(wù): 已知字符串變量s,請(qǐng)分別打印出(每種一行): 把字符串s中,前5個(gè)a,替換為b 把字符串s中,前3個(gè)c,替換為xxx 把結(jié)果打印出來(lái),一行數(shù)據(jù) 點(diǎn)我快速測(cè)試下面的代碼 s = "asdicagydausckfugdaflgscdabgsdbahhacbshbsd" print("s變換前的值:",s) --補(bǔ)全代碼 正則匹配相關(guān)內(nèi)容等待更新 跨文件調(diào)用 在編寫代碼時(shí),隨著邏輯逐漸復(fù)雜,我們的代碼量也會(huì)變大。雖然有函數(shù)可以把一部分代碼邏輯封裝起來(lái),但是所有代碼都放到一個(gè)文件里,顯然也不是個(gè)好辦法。 所以我們需要將一些代碼放到不同文件中,通過(guò)文件來(lái)區(qū)分這些代碼的功能。 比如我們有下面這個(gè)函數(shù): ---函數(shù)功能: -- 生成從1-max的table -- @輸入值:table的最大值 -- @返回: table結(jié)果 -- @例子: local list = getNumberList(10) function getNumberList(max) local t = {} for i=1,max do table.insert(t,i) end return t end 我們新建一個(gè)文件叫tools.lua,把這個(gè)函數(shù)放進(jìn)去,現(xiàn)在,整個(gè)文件如下面這樣: tools.lua ---函數(shù)功能: -- 生成從1-max的table -- @輸入值:table的最大值 -- @返回: table結(jié)果 -- @例子: local list = getNumberList(10) local function getNumberList(max) local t = {} for i=1,max do table.insert(t,i) end return t end --手動(dòng)返回一個(gè)table,包含了上面的函數(shù) return { getNumberList = getNumberList, } 現(xiàn)在,我們封裝的這個(gè)函數(shù)就能在其他文件里被調(diào)用了,具體代碼如下: --引用tools.lua文件,并加載 local tool = require("tools") local list = tool.getNumberList(12) 當(dāng)調(diào)用了require接口后,Lua虛擬機(jī)會(huì)自動(dòng)加載你調(diào)用的文件,執(zhí)行文件的內(nèi)容,然后返回你文件里return的結(jié)果。 為了更好地理解這段話,我們可以看下面兩個(gè)文件,其中run.lua是被運(yùn)行的那個(gè)入口文件 test.lua --以便一會(huì)兒返回使用的table local temp = {} --把全局變量a更改了 a = 1 --local變量無(wú)法被外部調(diào)用 --但是可以在文件內(nèi)被調(diào)用 local b = 2 --文件在被require的時(shí)候,會(huì)被執(zhí)行 --把全局變量c更改了 c = a + b --使函數(shù)在table里 function temp.addB() --文件內(nèi)部可以調(diào)用變量b b = b + 1 return b end --返回table return temp run.lua 點(diǎn)我快速測(cè)試下面的代碼 local test = require("test") print(a)--輸出1 print(b)--輸出nil,因?yàn)閎是local變量 print(c)--輸出3 print(test.addB())--輸出3 print(test.addB())--輸出4 print(test.addB())--輸出5 同時(shí),每個(gè)文件最多只會(huì)被require一次,如果有多個(gè)require,只有第一次會(huì)執(zhí)行 待添加 table -> sort排序 string -> 正則、gsub、find、match 迭代器 for xx in xx 、string.gmatch 元表 coroutine ↓各種接口↓ math庫(kù) os庫(kù) io庫(kù) 位運(yùn)算 (>> <<) 雜項(xiàng)接口 debug庫(kù) 未完成,待完善。。。 柚子快報(bào)邀請(qǐng)碼778899分享:LuatOS學(xué)習(xí)筆記 好文閱讀
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。