<p>在筆記之前,先提供16年5月31日在官網(wǎng)下載的LuaForWIndows的解釋器安裝包:點(diǎn)我<a title="Title">LuaForWindows.zip</a>,寶典上提到的你應(yīng)該使用5.1的最小版本。</p>
<p><h6>廢話</h6>
Lua解釋器是交互的,你輸入命令就可以得到回復(fù),就像是你在用Lua這門語(yǔ)言和解釋器進(jìn)行對(duì)話一般。雙擊執(zhí)行你的Lua解釋器輸入print("Hello World")
就會(huì)回顯到你解釋器的下一行。這行語(yǔ)句獲取你輸入的字符串,然后將它傳遞給了print(args)
這個(gè)函數(shù),該函數(shù)再將它輸出到解釋器窗口中。
對(duì)于Lua錯(cuò)誤信息的理解,你可以使用一個(gè)案例來(lái)進(jìn)行解讀,在輸入pnrint("Hello World!")
之后enter執(zhí)行,你會(huì)發(fā)現(xiàn)如下的信息<h6>[PS:lua中--代表注釋]</h6>
stdin:1: attempt to call global 'pnrint' (a nil value)--這里指出了錯(cuò)誤發(fā)生的行數(shù)
stack traceback:
stdin:1: in main chunk
[C]: ?
如上所示Lua提示你試圖調(diào)用一個(gè)全局的pnrint(args)
,但是她是一個(gè)空值,剩余的信息叫做棧追蹤[stack traback],他指出了錯(cuò)誤出現(xiàn)在哪里,當(dāng)你從一個(gè)函數(shù)調(diào)用另一個(gè)函數(shù)的他們很有用。另外使用上下鍵可以快速翻閱你的輸入歷史記錄。
</p>
<h6>Lua處理數(shù)字</h6>
<p>
輸入print(2+2)
你會(huì)看見系統(tǒng)響應(yīng)一個(gè)4,因?yàn)榻忉屍鲙湍阕隽诉\(yùn)算操作,Lua的運(yùn)算操作符支持如下:
<li>+:加,如上個(gè)例子所示
<li>-:減,同上,變更符號(hào)即可
<li>*:乘,同上
<li>/:除,同上
<li>^:冪,example:print(13^2)
=169
<li>%:取模,example:print(13%2)
=1
<li>-: 取負(fù),example:print(-(13^2))
=-1</li>
也可以使用復(fù)雜的表達(dá)式,注意運(yùn)算的優(yōu)先級(jí)和括號(hào)的使用即可,即確保明確的數(shù)據(jù)關(guān)系。
對(duì)于比較大的數(shù)值,比如1,000,000,000,000,000(10^15),你可以使用科學(xué)計(jì)數(shù)法來(lái)進(jìn)行表示解釋器能夠識(shí)別:
> print(10^15)
1e+015
> print(-10^15)
-1e+015
>
Lua為了將他們顯示出來(lái),先將他們轉(zhuǎn)化成了科學(xué)記數(shù)法,同時(shí)你也可以以這種方式來(lái)表達(dá)一個(gè)數(shù)字,表示取一個(gè)數(shù)10的幾次冪,冪指數(shù)為第二個(gè)數(shù)字(中間的e不區(qū)分大小寫):
> print(1.234e6)
1234000
> print(1.234\*10\*10\*10\*10\*10\*10)
1234000
> print(1234e-4)
0.1234
> print(1234\*(10^-4))
0.1234
十六進(jìn)制表示法:Lua可以自動(dòng)的將十六進(jìn)制的數(shù)值轉(zhuǎn)換成十進(jìn)制,以0x開頭后面接著有效的0~F十六進(jìn)制數(shù)字:
> print(0x1)
1
> print(0xF)
15
> print(0x19)
25
> print(0x10a4)
4260
coding時(shí)你可以使用這種格式來(lái)表示數(shù)字,Lua會(huì)對(duì)他們進(jìn)行正確的轉(zhuǎn)換,Lua僅以十進(jìn)制或者科學(xué)記數(shù)法來(lái)表示結(jié)果,不管這些數(shù)字是怎么輸入的。
> print(2\*0xF)
30
> print(0x10^2)
256
</p>
<p><h6>關(guān)于浮點(diǎn)的理解</h6>
在Lua中每一個(gè)數(shù)都是使用浮點(diǎn)來(lái)進(jìn)行表示的,在一般的使用中沒有什么不妥的地方,但有時(shí)候....
> pointTwo = 1.2 - 1.0
> print(pointTwo<0.2)
true
> print(pointTwo)
0.2
顯然,在這里0.2不能夠被精確的表示為一個(gè)浮點(diǎn)數(shù),因此編程語(yǔ)言必須在計(jì)算他的值和顯示他的時(shí)候進(jìn)入舍入。浮點(diǎn)數(shù)可以精確的表示所有的10-37~1037之間的整數(shù),所以你不會(huì)嘗嘗用到這個(gè)問題。然而,舍入在您使用實(shí)數(shù)的時(shí)候可能會(huì)導(dǎo)致計(jì)算誤差。
</p>
<p>
<h6>值和變量的理解</h6>
Lua和其他編程語(yǔ)言一樣對(duì)于值和和變量之間進(jìn)行了區(qū)分。了解值的種類和變量之間的區(qū)別對(duì)我們接下來(lái)的工作很有幫助。
什么是值?
他就是你直接使用的東西,就想17這個(gè)數(shù),或者"hello"這個(gè)字符串。14是一個(gè)不同于17的值,但是他們都是一個(gè)數(shù)值,字符串"hello"是一個(gè)值,但是他和14、17是不同類型的值。
Lua提供了如下的幾種基本數(shù)據(jù)類型
<li>number 所有的數(shù)字都屬于這一類 example:1、7313、1e5、0xFF1a
<li>string 一個(gè)字符序列 example:"Hello"
<li>boolean 真(true)和假(false)屬于這種類型
<li>function 函數(shù)是一個(gè)可以調(diào)用的語(yǔ)句集合
<li>table 表示傳統(tǒng)的哈希(Hash)表(字典)和數(shù)組的混合類型
<li>thread 線程類型的值是一個(gè)可用于異步計(jì)算的協(xié)同程序(有限的輕量線程)
<li>userdata 用戶數(shù)據(jù)是主語(yǔ)言(host language,通常是C)中所定義的傳統(tǒng)的數(shù)據(jù)結(jié)構(gòu)包裝器
這幾種數(shù)據(jù)類型都會(huì)在以后的工作中出現(xiàn),需要進(jìn)行仔細(xì)的理解。
</p>
</p>
<h6>使用type(args)函數(shù)</h6>
type(args)在Lua中用于確定一個(gè)給定值的類型,它會(huì)給你在編程中進(jìn)行確認(rèn)和驗(yàn)證帶來(lái)更大的靈活性:
> print(type(t))
nil
> print(type(5))
number
> print(type(""))
string
> print(type(table))
table
如上所示,你對(duì)于傳入的值進(jìn)行了type(args)
函數(shù)的調(diào)用,并且對(duì)他的結(jié)果進(jìn)行了print(args)
調(diào)用,所以它輸出了你傳入的值是何種類型,指的注意的是,第一個(gè)輸出中,Lua解釋器給出了nil
因?yàn)榻忉屍魉也坏竭@個(gè)類型,所以他總是nil的。</p>
<p>
<h6>使用變量</h6>
變量可以看做是一個(gè)Lua值的臨時(shí)名稱,而同一個(gè)可以有多個(gè)名稱。比如如下的例子:
> x=2
> y=2
> print(x+y)
4
這個(gè)例子中,你將x、y兩個(gè)變量分別綁定了一個(gè)值2,然后調(diào)用print(args)
進(jìn)行輸出。
變量名的命名規(guī)范:必須以下劃線或者字母開頭。名稱本身不能包含有除字母、數(shù)字或者下劃線之外的其他字符。同時(shí)也不能是關(guān)鍵字,并且是區(qū)分大小寫的。
變量的賦值:
> foo=14
> print(foo)
14
> foo="hello"
> print(foo)
hello
> x=12--將數(shù)值4綁定到x
> y=x+2--將標(biāo)識(shí)符x的值賦予標(biāo)識(shí)符y并+2。這在字面上表示y=12+2
> print(x+y)
26
> x=15--如果你將x從新賦值,那么也只是意味著你將x重新綁定了值,與y無(wú)關(guān)
> print(x+y)
29
--值和變量之前的區(qū)別嘗嘗會(huì)被混淆,尤其是你在更高級(jí)的論題上工作的時(shí)候,你可以使用Lua解釋器作
--為一個(gè)工具來(lái)探索這些規(guī)則
對(duì)多個(gè)變量賦值的形式:
> x,y=12,13--如果運(yùn)算符左邊的變量個(gè)數(shù)比右邊多,那么剩下的變量會(huì)被賦予nil值
> print(x+y)
25
</p>
<p>
<h6>Lua中關(guān)于值的比較</h6>
Lua中的比較運(yùn)算符由如下幾種可供操作:
<li>相等 ==
<li>小于 <
<li>大于 >
<li>小于等于 <=
<li>大于等于 >=
<li>不等于 ~=</li>
“<”,“>”,“<=”,“>=”運(yùn)算符只能用來(lái)比較相同類型的值,例如在數(shù)和數(shù)之間或者字符串和字符串之間進(jìn)行比較,否則你會(huì)收到下面的錯(cuò)誤信息:
> print(1>="hello")
stdin:1: attempt to compare string with number
stack traceback:
stdin:1: in main chunk
[C]: ?
換個(gè)說(shuō)法就是:“==”和“~=”適用于所有的值,而大于和小于(“<”和“>”)這一組運(yùn)算符只在數(shù)值和字符串內(nèi)部有意義。
> print("hello"=="hello1")--進(jìn)行字符串比較的時(shí)候比較的是他們的內(nèi)容是否相同
false
> print("hello"=="hello")
true
</p>
<p>
<h6>Using 字符串</h6>
“>”、“<” 運(yùn)算符可以在字符串上使用,但是結(jié)果將取決于系統(tǒng)內(nèi)部對(duì)不同字符的排列次序,對(duì)于單個(gè)字符的比較,運(yùn)算符比較兩個(gè)字符在字符集中的次序; 對(duì)于多個(gè)字符比較,他將比較兩個(gè)字符串中第一個(gè)出現(xiàn)的不同字符。
> print("hello"=="hello1")--1
false
> print("hello"=="hello")--2
true
> print("a"<"b")--3
true
> print("b">="a")--4
true
> print("abcd"<"abce")--5
true
> print("a"<"A")--6
false
> print("abcd"<"abcde")
true
> print("rests"<"test")--比較第一個(gè)出現(xiàn)的不同字符,也就是拿著'r'和't'比較
true
第6個(gè)例子,在標(biāo)準(zhǔn)的Lua字符集中,大寫英文字母在小寫英文字母簽名,因此,'a'要比'A'大。
</p>