今天我們繼續(xù)學(xué)習(xí)Lua語(yǔ)法基礎(chǔ)教程,中篇。
五、變量
5.1 number變量
變量,可以看作是一個(gè)桶,在里面裝你想要裝的內(nèi)容。這些內(nèi)容可以是Lua包含的所有合法類型。
例如:我想要新建一個(gè)桶,名叫bucket,在里面放入233這個(gè)數(shù)字,就可以像下面一樣:
bucket = 233
讓我們?cè)囍约盒陆◣讉€(gè)變量吧!
- 新建變量year,并將變量的值設(shè)置為1926
- 新建變量month,并將變量的值設(shè)置為8
- 新建變量day,并將變量的值設(shè)置為7
--新建三個(gè)變量,并賦值
year = 1926
month = 8
day = 7
--打印出三個(gè)變量的值
print(year,month,day)
5.2 了解nil
nil類型表示沒(méi)有任何有效值,只要是沒(méi)有聲明的值,它就是nil
比如我打印一個(gè)沒(méi)有聲明的值,便會(huì)輸出nil:
ccc = 233
print(ccc)
print(aaa)
這里需要你思考一下,運(yùn)行以下代碼,將會(huì)輸出什么結(jié)果?
a = 1
b = '2'
c = a
print(a,b,c,d)
5.3 賦值語(yǔ)句
賦值是改變一個(gè)變量值的最基本的方法。
如下面一樣,使用等號(hào)對(duì)左邊的變量進(jìn)行賦值
n = 2
n = 3
n = n + 1
b = n
Lua可以對(duì)多個(gè)變量同時(shí)賦值,變量用逗號(hào)分開,賦值語(yǔ)句右邊的值會(huì)依次賦給左邊的變量。
n = 1
a, b = 10, 2*n
當(dāng)左右值的數(shù)量不一致時(shí),Lua會(huì)進(jìn)行下面的設(shè)定:
- 變量個(gè)數(shù) > 值的個(gè)數(shù):按變量個(gè)數(shù)補(bǔ)足nil
- 變量個(gè)數(shù) < 值的個(gè)數(shù):多余的值會(huì)被忽略
下面的例子可以展示這種設(shè)定:
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
這里需要你思考一下,運(yùn)行以下代碼,將會(huì)輸出什么結(jié)果?
a,b,c = 1,2,3
a,c = a+1,b
d = c,b
print(a,b,c,d)
5.4 交換變量
這部分需要你自己完成一個(gè)任務(wù):
已知下面的代碼,并且已知a
和b
的值,請(qǐng)?jiān)诮粨Q他們的值,使打印輸出12 34
a = 34
b = 12
--你需要在這里進(jìn)行交換變量的操作
--提示:新建一個(gè)變量來(lái)存放臨時(shí)的值
print(a,b)
5.5 輸出變量
我們已經(jīng)知道了,在Lua中,可以使用print函數(shù)來(lái)打印你想要得到的結(jié)果。
同時(shí)在上一節(jié),我們學(xué)會(huì)了新建變量和設(shè)置變量的值。
讓我們?cè)囍敵瞿硞€(gè)變量吧!使用print函數(shù)
,輸出已知變量。 我們已知變量num
為某個(gè)數(shù)字,試著輸出它的值吧!
num = 123
--請(qǐng)補(bǔ)全代碼,輸出num的值
print(你要在這里填東西)
5.6 算數(shù)運(yùn)算符
運(yùn)算符是一個(gè)特殊的符號(hào),用于告訴解釋器執(zhí)行特定的數(shù)學(xué)或邏輯運(yùn)算。
上一節(jié)中,新建的數(shù)字變量,我們稱之為number類型的變量。
本節(jié)我們來(lái)學(xué)習(xí)使用算術(shù)運(yùn)算符,如下所示:
- 加法
- 減法
- 乘法
/ 除法
% 取余,求出除法的余數(shù)
^ 乘冪,計(jì)算次方
- 負(fù)號(hào),取負(fù)值
我們可以通過(guò)以下實(shí)例來(lái)理解算術(shù)運(yùn)算符的應(yīng)用:
a = 21
b = 10
c = a + b
print('a + b 的值為 ', c )
c = a - b
print('a - b 的值為 ', c )
c = a * b
print('a * b 的值為 ', c )
c = a / b
print('a / b 的值為 ', c )
c = a % b
print('a % b 的值為 ', c )
c = a^2
print('a^2 的值為 ', c )
c = -a
print('-a 的值為 ', c )
c = a * (b - a)
print('a * (b - a) 的值為 ', c )
你需要完成下面的任務(wù):
已知,一個(gè)長(zhǎng)方體的長(zhǎng)寬高分別為a、b、c(單位米),且這個(gè)物體重量為m(單位克)
請(qǐng)打印出物體的密度(單位g/m3)
注:密度計(jì)算公式 密度 = 質(zhì)量 / 體積
a,b,c = 1,2,3 --長(zhǎng)寬高
m = 10 --重量
--請(qǐng)打印出物體的密度
六、字符串
6.1 string 類型變量
字符串(即string),就是一串文本數(shù)據(jù),可以存儲(chǔ)你要的文本。
在第二節(jié)中,print出的數(shù)據(jù)就是一個(gè)字符串。
Lua 語(yǔ)言中字符串可以使用以下三種方式來(lái)表示:
- 單引號(hào)間的一串字符
- 雙引號(hào)間的一串字符
- [[和]]間的一串字符
你可以參考下面的例子來(lái)深入理解:
--雙引號(hào)間的一串字符
str1 = "Lua"
--單引號(hào)間的一串字符
str2 = 'Lua'
--[[和]]--間的一串字符
str3 = [[Lua]]
str4 = [[使用雙括號(hào)時(shí),甚至能包含換行數(shù)據(jù)
換行了
最后一行]]
--輸出所有字符串
print(str1)
print(str2)
print(str3)
print(str4)
接下來(lái)你需要完成下面的練習(xí):
新建三個(gè)變量s1、s2、s3
分別存入字符串?dāng)?shù)據(jù):str、abc、233,使輸出打印正確
--請(qǐng)?jiān)诳瞻滋幯a(bǔ)全代碼
print("s1,s2,s3的值:",s1,s2,s3)
print("s1,s2,s3的類型:",type(s1),type(s2),type(s3))
6.2 轉(zhuǎn)義字符
在上一節(jié)中,我們學(xué)習(xí)了如何聲明字符串。
但是我們有時(shí)候會(huì)遇到一些特殊的問(wèn)題,如:如何輸出單引號(hào)和雙引號(hào)?如何輸出回車換行?
也許我們可以用下面的方式簡(jiǎn)單規(guī)避,輸出單引號(hào)時(shí),聲明字符串用雙引號(hào)括起來(lái),像下面這樣
str = "'"
同理,輸出雙引號(hào)時(shí),聲明字符串用單引號(hào)括起來(lái),像下面這樣
str = '"'
但是,這樣會(huì)出現(xiàn)一個(gè)問(wèn)題:如何同時(shí)顯示單引號(hào)和雙引號(hào)?這里就需要轉(zhuǎn)義字符登場(chǎng)了。
轉(zhuǎn)義字符用于表示不能直接顯示的字符,比如后退鍵、回車鍵、等。
以 開頭的都是轉(zhuǎn)義字符,下面時(shí)常用的轉(zhuǎn)義字符格式:
轉(zhuǎn)義字符 | 含義 |
---|---|
n | 換行(LF),將當(dāng)前位置移到下一行開頭 |
r | 回車(CR),將當(dāng)前位置移到本行開頭 |
反斜杠字符 | |
' | 單引號(hào) |
" | 雙引號(hào) |
? | 空字符(NULL) |
ddd | 1到3位八進(jìn)制數(shù)所代表的任意字符 |
xhh | 1到2位十六進(jìn)制所代表的任意字符 |
例如,如果我們想給str賦值一個(gè)單引號(hào),一個(gè)雙引號(hào)('"),那么我們可以這樣寫:
str = "'""
下面需要你來(lái)完成一個(gè)簡(jiǎn)單的任務(wù):
新建一個(gè)變量str,給str賦值為
abcd"ef'gh]]
并打印出來(lái)
str = --補(bǔ)全代碼
print(str)
--輸出應(yīng)為abcd"ef'gh]]
6.3 string拼接
字符串和字符串可以相加嗎?可以!我們可以用拼接符號(hào)來(lái)將兩個(gè)獨(dú)立的字符串拼起來(lái)。
我們使用..
來(lái)表示字符串拼接符號(hào),如下面的示例代碼:
print('abc'..'def')
str1 = '123'
str2 = '999'
print(str1..str2)
下面你要完成這個(gè)任務(wù):
已知三個(gè)字符串變量s1
、s2
、s3
請(qǐng)將他們按順序拼接起來(lái),存入all
,并使用print輸出結(jié)果
s1,s2,s3 = "aaa","bbb","ccc"
all = --請(qǐng)補(bǔ)全代碼
print(all)
6.4 number轉(zhuǎn)string
上面一節(jié)學(xué)習(xí)了如何拼接字符串,這個(gè)方法固然很好用,但是有時(shí)候我們會(huì)遇到一個(gè)需求,那就是把number
類型的變量和string
類型的變量拼接起來(lái),組成一個(gè)新的string
比如下面的變量n
和s
,如何拼接起來(lái)呢?
n = 123
s = 'm/s'
我們可以直接將number
類型的變量n
轉(zhuǎn)換成string
類型的值,這樣就可以拼接了
使用tostring(value)
函數(shù)即可實(shí)現(xiàn)這一操作:
n = 123
s = 'm/s'
result = tostring(n)..s
print(result)
下面你要完成這個(gè)任務(wù):
已知三個(gè)變量n1
、s
、n2
然后將他們按順序拼接起來(lái),存入變量result
,使輸出結(jié)果正確
小提示:在某些情況下,Lua會(huì)自動(dòng)將number類型轉(zhuǎn)換成string類型
n1,s,n2 = 1,"abc",2
result = --請(qǐng)補(bǔ)全代碼
print(result)
6.5 string轉(zhuǎn)number
上面一節(jié)學(xué)習(xí)了如何將number轉(zhuǎn)成string,這一節(jié)我們來(lái)學(xué)習(xí)如何將string轉(zhuǎn)成number
比如下面的變量s
,存儲(chǔ)的內(nèi)容是一個(gè)字符串,但是代表了一個(gè)數(shù)字,如何轉(zhuǎn)成number再與n相加計(jì)算呢?
n = 123
s = '2333'
我們可以直接將string
類型的變量s
轉(zhuǎn)換成number
類型的值,這樣就可以計(jì)算了
使用tonumber(value)
函數(shù)即可實(shí)現(xiàn)這一操作:
n = 123
s = '2333'
result = tonumber(s) + n
print(result)
下面你要完成這個(gè)任務(wù):
已知三個(gè)字符串變量s1
、s2
、s3
,其內(nèi)容均為純數(shù)字
請(qǐng)計(jì)算他們的算術(shù)和,賦值給新建的變量result
,使下面代碼輸出正確結(jié)果
s1,s2,s3 = "11","12","100"
result = --請(qǐng)補(bǔ)全代碼
print(result)
七、邏輯運(yùn)算
7.1 布爾型和比較運(yùn)算
布爾型(boolean)只有兩個(gè)可選值:true(真) 和 false(假)
Lua 把 false 和 nil 看作是false,其他的都為true(包括0這個(gè)值,也是相當(dāng)于true)
Lua 中也有許多的關(guān)系運(yùn)算符,用于比較大小或比較是否相等,符號(hào)及其含義如下表:
符號(hào) | 含義 |
---|---|
== | 等于,檢測(cè)兩個(gè)值是否相等,相等返回 true,否則返回 false |
~= | 不等于,檢測(cè)兩個(gè)值是否相等,相等返回 false,否則返回 true |
> | 大于,如果左邊的值大于右邊的值,返回 true,否則返回 false |
< | 小于,如果左邊的值大于右邊的值,返回 false,否則返回 true |
>= | 大于等于,如果左邊的值大于等于右邊的值,返回 true,否則返回 false |
<= | 小于等于, 如果左邊的值小于等于右邊的值,返回 true,否則返回 false |
我們可以通過(guò)以下實(shí)例來(lái)更加透徹的理解關(guān)系運(yùn)算符的應(yīng)用:
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)
下面問(wèn)題來(lái)了,運(yùn)行以下代碼,將會(huì)輸出什么結(jié)果?請(qǐng)自行思考
a = 1
b = '1'
c = a
d = 2
print(a == b)
print(c == a)
print(a ~= b)
print(d <= c)
7.2 邏輯運(yùn)算符
邏輯運(yùn)算符基于布爾型的值來(lái)進(jìn)行計(jì)算,并給出結(jié)果,下表列出了 Lua 語(yǔ)言中的常用邏輯運(yùn)算符:
符號(hào) | 含義 |
---|---|
and | 邏輯與操作符。 若 A 為 false,則返回 A,否則返回 B |
or | 邏輯或操作符。 若 A 為 true,則返回 A,否則返回 B |
not | 邏輯非操作符。與邏輯運(yùn)算結(jié)果相反,如果條件為 true,邏輯非為 false |
我們可以通過(guò)以下實(shí)例來(lái)更加透徹的理解邏輯運(yùn)算符的應(yīng)用:
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)
下面問(wèn)題來(lái)了,運(yùn)行以下代碼,將會(huì)輸出什么結(jié)果?
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)
7.3 檢驗(yàn)大小(自測(cè)題)
題目:如果已知number變量n
,那么如果需要判斷n是否符合下面的條件:
3
以下四行判斷代碼,正確的是?
(返回true即表示變量n
符合要求)
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)
八、分支判斷
8.1 條件判斷
上面一節(jié)學(xué)習(xí)了布爾類型,那么這個(gè)需要用到哪里呢?我們需要用它來(lái)進(jìn)行某些判斷。
在Lua中,可以使用if語(yǔ)句來(lái)進(jìn)行判斷,如下面所舉例的代碼,可以判斷n是否為小于10的數(shù):
n = 5
if n < 10 then
print('n小于10')
end
我們整理一下,實(shí)際上if語(yǔ)句就是如下結(jié)構(gòu):
if 條件 then
符合條件的代碼
end
下面是你需要完成的事:
已知變量n
,請(qǐng)判斷n
是否為奇數(shù),如果是,請(qǐng)給n
的值加上1
如果你覺(jué)得有難度,請(qǐng)查看下面的提示:
- 求出
n
除以2的余數(shù):n % 2 - 給
n
的值加上1:n = n + 1
--已知一個(gè)number變量n
n = 5 --這個(gè)數(shù)字是幾都有可能
print("n在判斷前的值",n)
if 你的條件 then
要做的事
end
print("n在判斷后的值",n)
8.2 多條件判斷
上面一節(jié)學(xué)習(xí)了簡(jiǎn)單的if語(yǔ)句寫法,這一節(jié)我們來(lái)學(xué)習(xí)多條件分支語(yǔ)句
在Lua中,可以使用if語(yǔ)句來(lái)進(jìn)行判斷,同時(shí)可以使用else語(yǔ)句,表示多個(gè)分支判斷
if 條件1 then
滿足條件1
elseif 條件2 then
不滿足條件1,但是滿足條件2
else
前面條件全都不滿足
end
舉個(gè)例子,比如有一個(gè)數(shù)字n
:
- 當(dāng)它大于等于0、小于5時(shí),輸出
太小
, - 當(dāng)它大于等于5、小于10時(shí),輸出
適中
, - 當(dāng)它大于等于10時(shí),輸出
太大
,
那么代碼就像如下這樣:
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)的兩倍
--已知一個(gè)number變量n
n = 5 --這個(gè)數(shù)字是幾都有可能
print("n在判斷前的值",n)
if 你的條件 then
要做的事
else
要做的事
end
print("n在判斷后的值",n)
8.3 判斷三角形合法性(自測(cè)題)
你需要使用前面幾章的知識(shí),來(lái)完成下面的題目
已知三個(gè)number類型的變量a、b、c,分別代表三根木棒的長(zhǎng)度
請(qǐng)判斷,使用這三根木棒,是否可以組成一個(gè)三角形(兩短邊之和大于第三邊)
- 如果可以組成,就打印出true
- 如果不可以,就打印false
a,b,c = 1,2,3--多改幾個(gè)數(shù)值自行測(cè)試
--補(bǔ)全代碼
8.4 if的判斷依據(jù)(自測(cè)題)
我們?cè)谇懊媪私獾剑琇ua 把 false 和 nil 看作是false,其他的都為true(包括0這個(gè)值,也是相當(dāng)于true)
那么問(wèn)題來(lái)了,執(zhí)行下面的代碼,將會(huì)輸出什么?
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)
九、函數(shù)
9.1 初識(shí)函數(shù)
函數(shù)是指一段在一起的、可以做某一件事兒的程序,也叫做子程序。
在前面的內(nèi)容中,我們已經(jīng)接觸過(guò)了函數(shù)的調(diào)用,這個(gè)函數(shù)就是前面用到了很多次的print(...)。
調(diào)用函數(shù)只需要按下面的格式即可:
函數(shù)名(參數(shù)1,參數(shù)2,參數(shù)3,......)
為何要使用函數(shù)?因?yàn)楹芏嗍虑槎际侵貜?fù)性操作,我們使用函數(shù),可以快速完成這些操作
下面我們舉一個(gè)最簡(jiǎn)單的函數(shù)例子,這個(gè)函數(shù)沒(méi)有傳入?yún)?shù)、沒(méi)有返回值
它實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的功能,就是輸出Hello world!:
function hello()
print('Hello world!')
end
這個(gè)函數(shù)名為hello,我們可以按下面的方法進(jìn)行調(diào)用(執(zhí)行):
function hello()
print('Hello world!')
end
hello()
這行代碼會(huì)輸出Hello world!。
同時(shí),在Lua中,函數(shù)也是一種變量類型,也就是說(shuō),hello實(shí)際上也是一個(gè)變量,里面存儲(chǔ)的是一個(gè)函數(shù),我們可以用下面的代碼來(lái)理解:
function hello()
print('Hello world!')
end
a = hello
--把hello函數(shù)同時(shí)賦值給a變量
a()
hello()
--a和hello變量指向同一個(gè)函數(shù)
--所以執(zhí)行結(jié)果和hello()相同
因?yàn)楹瘮?shù)只是個(gè)變量,你甚至在一開始可以這樣聲明hello函數(shù):
hello = function()
print('Hello world!')
end
hello()
下面你需要做一件簡(jiǎn)單的事情:
- 新建一個(gè)函數(shù)變量
biu
,使其執(zhí)行后會(huì)打印biubiubiu
這個(gè)字符串 - 新建一個(gè)函數(shù)變量
pong
,使其與biu
指向的函數(shù)相同
--請(qǐng)?jiān)诖颂幯a(bǔ)全代碼
--請(qǐng)使下面的調(diào)用可以正常打印出biubiubiu
biu()
pong()
print("biu和pong相等嗎?",biu==pong)
9.2 local變量
之前我們創(chuàng)建的變量,都是全局變量,這種變量在代碼運(yùn)行周期從頭到尾,都不會(huì)被銷毀,而且隨處都可調(diào)用。
但是當(dāng)我們代碼量增加,很多時(shí)候大量新建全局變量會(huì)導(dǎo)致內(nèi)存激增,我們需要一種可以臨時(shí)使用、并且可以自動(dòng)銷毀釋放內(nèi)存資源的變量,要怎么解決呢?
我們可以使用local標(biāo)志來(lái)新建臨時(shí)變量,使用local創(chuàng)建一個(gè)局部變量,與全局變量不同,局部變量只在被聲明的那個(gè)代碼塊內(nèi)有效。
參考下面的代碼:
a = 123
function add()
local n = a+2
print(n)
end
add()
print(n)
上面的代碼中,n就是一個(gè)局部變量,它只在這個(gè)funcion中有效,并且函數(shù)運(yùn)行完后會(huì)自動(dòng)回收這部分的內(nèi)存。
我們應(yīng)該盡可能的使用局部變量,以方便lua虛擬機(jī)自動(dòng)回收內(nèi)存空間,同時(shí)減少資源占用提高運(yùn)行速度。
下面請(qǐng)閱讀以下代碼,思考一下,正確的輸出結(jié)果是什么:
str = 'abc'
function connect()
local s = str..'def'
end
print(s,str)
9.3 函數(shù)參數(shù)
在前幾章的使用中,我們知道函數(shù)是可以傳入?yún)?shù)的,如print(123)
那么,我們?nèi)绾尉帉懣梢詡魅雲(yún)?shù)的函數(shù)呢?可以按下面的模板來(lái)寫
function 函數(shù)名(參數(shù)1,參數(shù)2,...)
代碼內(nèi)容
end
這里傳入的參數(shù),等價(jià)于在函數(shù)內(nèi)部新建了一個(gè)local的變量,修改這些數(shù)據(jù)不會(huì)影響外部的數(shù)據(jù)(除了后面還沒(méi)有講到的table等類型)
舉個(gè)例子,比如下面的函數(shù),可以實(shí)現(xiàn)打印出兩個(gè)傳入值的和:
function add(a,b)
print(a+b)
end
add(1,2)
--會(huì)輸出3
這段代碼其實(shí)等價(jià)于:
function add()
local a = 1
local b = 2
print(a+b)
end
add()
下面問(wèn)題來(lái)了,請(qǐng)?jiān)O(shè)計(jì)一個(gè)函數(shù)p,可以按下面的調(diào)用方式來(lái)打印出物體的密度:
--補(bǔ)全這個(gè)函數(shù)的代碼,滿足題目要求
function p(a,b,c,m)
print()
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)
接下來(lái)我們會(huì)分享最后一部分。
審核編輯 黃宇
-
變量
+關(guān)注
關(guān)注
0文章
613瀏覽量
28363 -
Lua
+關(guān)注
關(guān)注
0文章
81瀏覽量
10558
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論