第二課 型別和值

2021-07-25 06:33:00 字數 3831 閱讀 2937

lua是一種動態型別語言。沒有型別定義的語法。每個值都攜帶了它自身的型別資訊。

8種基礎型別:nil(空) boolean(布林) number(數字)

string(字串) userdata(自定義型別) function(函式)

thread(執行緒) table(表)

函式type可 根據乙個值返回其型別名稱。

print(type("hello world")) -->string

print(type(type)) -->function

print(type(nil)) -->nil

變數沒有預定義型別,任何變數都可以包含任何型別的值

a = print

a(type(a)) -->function

在lua中,函式是作為「第一類值(first-class value)」來看待的,可以像操作其他值一樣來操作函式值

nil(空)

nil是乙個型別,它只有乙個值nil。它的主要功能是用於區別其他任何值。

boolean(布林)

true,false。lua將nil和false視作「假」,其他情況均為「真」

number(數字)

number型別用於表示實數。lua沒有整數型別,因為沒有必要。事實上,只要使用雙精度來表示乙個整數,就不會出現「四捨五入(rounding)」的錯誤。

string(字串)

lua完全採用8位編碼,lua字串中的字元可以具有任何數值編碼,包括數值0。

lua中的字串是不可變的值。所以沒有字串變數一說。要改變字串值只能建立乙個新字串。

字面字串(literal string)需要以一對匹配的單引號或雙引號來界定:

a = "a line"

b = 'another line'

lua字串中可以有類c語言中的轉義序列。如:\n,\r等。

可以通過數值來指定字串中的字元,數值以轉義序列「\」給出,是乙個至多3個十進位制數字組成的序列。

「alo\n123\"」 == '\97lo\10\04923"'

ascii 編碼中,'a'是97,換行是10,『1』是49。

一對匹配的雙括號來界定乙個字母字串,就像寫塊注釋一樣。lua不會解釋其中的轉義序列。如果字串的第乙個字元是換行字元,lua會忽略它。

page = [[

]] [[之中還可以加任意數量的==,兩邊許匹配==數量

[===[ ]===]

--[==[ --]==]

lua提供了執行時的數字和字串的自動轉換。

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

print("hello" + 1) --錯誤

同樣,在lua期望乙個字串但卻得到乙個數字時,它也會將 數字轉換成字串。

print(10 .. 20) -->1020

..(兩個點)是字串連線符,當直接在乙個數字後面輸入它時,必須使用乙個空格來分割它們。不然,lua會將第乙個點理解為乙個小數點。

比較運算子10=="10"總為false。

如果需要顯示地將字串轉換為數字,可以使用函式tonumber。如果字串的內容不能表示乙個正確的數字時,tonumber將返回nil。

若要將-個數字轉換成字串,可以呼叫函式tostring,或者將該數字與乙個空字串連線。

print(tostring(10) == "10") -->true

print(10 .. "" == "10") -->true

在lua5.1中,可以在字串前放置操作符「#」來獲得該字串的長度。#號被稱作「長度操作符」

a = "hello"

print(#a) -->5

table(表)

table型別實現了「關聯陣列」。關聯陣列是一種具有特殊索引方式的陣列。不僅僅可以通過整數來索引它,還可以使用字串或者其他型別的值(除了nil)來索引它。table沒有固定的大小,可以動態地新增任意數量的元素到乙個table中。lua也是通過table來表示模組(module)、包(package)和物件(object)的。當輸入io.read的時候,其含義是「io」模組中的read函式。對於lua而言,這表示「使用字串「read」作為key(鍵)來索引table io」

table既不是「值」也不是「變數」,而是「物件」。

table的建立是通過「構造表示式」完成的,最簡單的構造表示式是{}。

a = {} --建立乙個table,並將它的引用儲存到a

k = "x"

a[k] = 10 --新條目,key="x",value=10

a[20] = "great" --新條目,key=20,value="great"

print(a["x"]) -->10

k = 20

print(a[k]) --> "great"

a["x"] = a["x"] + 1 --遞增條目"x"

print(a["x"]) -->11

table永遠是匿名的,乙個持有table的變數與table自身之間沒有固定的關聯性。

a = {}

a["x"] = 10或者a.x = 10

b = a --b與a引用了同乙個table

print(b["x"])或者print(b.x) -->10

b["x"] = 20

print(a["x"]) -->20

a = nil --現在只有b還在引用table

b = nil --再也沒用對table的引用了

lua中的陣列表示:

a = {}

for i = 1,10 do

a[i] = io.read()

end就lua的習慣而言,陣列通常以1作為索引的初始值。並且有不少機制依賴於這個慣例。

在lua5.1中,長度操作符「#」用於返回乙個陣列或線性表的最後乙個索引值(或為其大小)。

--列印所有的行

for i =1,#a do

print(a[i])

endprint(a[#a]) --列印列表a的最後乙個值

a[#a] = nil --刪除最後乙個值

a[#a + 1] = v --將v新增到列表末尾

陣列大小的概念是模糊的,因為陣列實際上是table。

對於所有未初始化的元素的索引結果都是nil。lua將nil作為界定陣列結尾的標誌。當乙個陣列有空隙時,即中間存在nil時,長度操作符會認為這些nil元素就是結尾標記,因此應該避免對那些含有空隙的陣列使用長度操作符#。如果真的需要處理那些含有「空隙」的陣列,可以使用函式table.maxn(lua5.1新函式),它將返回乙個table的最大正索引數。

a = {}

a[10000] = 10

print(table.maxn(a)) -->10000

i = 10;j = "10"; k = "+10"

a = {}

a[i] = "one value"

a[j] = "another value"

a[k] = "yet another value"

print(a.j) -->"another value"

print(a.k) -->"yet another value"

print(a[tonumber(j)]) -->"one value"

print(a[tonumber(k)]) -->"one value"

function(函式)

函式是作為「第一類值」來看待的。就和其他普通型別一樣。可以儲存在變數中,可以作為函式引數傳遞,可以作為函式返回值返回。

userdata(自定義型別)和thread(執行緒)

由於userdata型別可以將任意的c語言資料儲存到lua變數中。在lua中,這種型別沒有太多的預定義操作,只能進行賦值和相等性測試。

第二課 安裝PHP

為什麼要安裝php?php是伺服器端解析程式,一般執行在網路伺服器上。而編寫php語言的程式我們一般是在自己的個人電腦上完成,然後拿到伺服器上除錯。所以,學習php首先要讓我們的個人電腦模擬伺服器執行環境,讓php能象在伺服器上一樣在我們的個人電腦上執行。這就是為什麼要安裝配置php的原因。安裝配置...

csdn之旅 第二課

1.html標題的標籤 1 注意 只能到,在往後就沒有作用了。2 標籤特點 可以區別其他文字,比如可以加粗 效果圖如 笑對生活!笑對生活!笑對生活!笑對生活!改變字型大小 可以自動換行 2.html段落標記 用元素 注意 標籤和標籤之間的關係 可以巢狀使用 但不可以交叉 3.html常用標記 單標記...

第二課 加法運算

在程式設計當中,文字框及按鈕是用得比較多的乙個控制項,我們先來學學如何使用這兩個控制項。1 新建乙個窗體 2 在窗體上放置三個文字框控制項,分別命名為 txtnum1 txtnum2 txtnum3,我們在命名時,盡量規範一點,可參考這裡 3 在窗體上放置乙個按鈕,命名為cmdcount 開始程式設...