型別與值
lua 是動態型別的語言
- 在語言中沒有型別定義的語法
- 每個值都攜帶有它的型別資訊
8種基礎型別
- 用 type 可以回傳這個值的型別的名稱
- 將一個變數用于不同型別,通常會導致混亂的代碼
- 但合理使用,如例外情況下回傳 nil ,以區別正常情況下的其他型別的回傳值
- 變數沒有預定義的型別,任何變數都可以包含任何型別的值
print(type("Hello")) --string
print(type(666)) --number
a = print
print(type(a)) --function
a = 111
print(type(a)) --number
print(type(b)) --nil
print(type(string)) -- table 不太懂為什么
print(type(type(X))) -- string
- 最后一行將永遠回傳將永遠回傳 "string" , 而無關乎 X 這個值的內容,這是因為 type 函式總是回傳一個字串
nil (空)
- nil 型別只有一個值,表示空
- 主要功能是區別其他任何值
- 一個全域變數在它第一次賦值之前它的默認值就是 nil
- 將 nil 賦給一個全域變數等同于洗掉這個變數
- lua 將 nil 用于表示一種 "無效值"的情況,即沒有任何有效值的情況
boolean (布爾)
- 布爾型別有兩個可選值,
- 一個是 true,一個是 false
- true 表示真, false 表示假
- boolean 不是條件值的唯一表達方式
- 在 lua 中任何值都可以用來表示條件
- lua 將值 false , nil 視為假,將除此之外的其他值視為真
- lua 在條件測驗中數字 0 和空字串都視為真
number (數字)
- lua 中用于表示實數,即雙精度浮點數
- lua 沒有整數型別
- 可以重新編譯 lua ,使用其他型別來表示數字
- 如 使用長整型 long 表示數字,或單精度浮點數 float 表示數字
- 書寫一個數值常量,可以使用普通寫法或科學計數法
科學計數法
- 在計算機中用 e 或 E 表示 ,表示10的幾次方
- 可以簡單理解為e 后面是多少就挪幾個0
a = 3.2e2
print(a) --320
string (字串)
- lua 中的字串通常表示為一個字符序列
- lua 采用8位編碼
- lua 字串中的字符可以具有任何數值編碼包括數值0
- 這種特性:可以讓我們將任意進制(如二進制),存盤到字串中
- lua 中的字串是不可變的值,不能像 C 語言那樣可以直接修改一個字串中的某個字符
- 而是應該根據修改要求建立一個新的字串
修改子串
a = "one string"
b = string.gsub(a, "one", "another") -- 字串替換函式
print(b) -- another string
print(a) -- one string
- lua 中的字串和其他的 lua 物件如 table, function 一樣都是自動記憶體管理機制所保存的物件
- 這意味著我們無需擔心字串的分配和釋放
- 字串可以是一個字母也可以是一本書的所有字符
- lua 可以高效處理長字串,如100k ,1M容量的字串
字面字串
- 需要用一對匹配的單引號或者雙引號來包裹
- 如果字串本身包含兩種引號中的一種,我們可以使用另一種引號來包裹
- 也可以使用 \ 來進行轉義
a = 'Hello'
b = "World"
c = "I'm a student"
d = "I\'m a student'"
轉義序列
- \a 響鈴
- \b 退格
- \f 提供表格
- \n 換行
- \' 單引號
- \" 雙引號
- \t 水平tab
- \v 垂直 tab
- \\ 反斜杠
- \r 回車
print("one line\nnext line\"in quotes\",'in quotes'")
--[[
one line
next line
"in quotes",'in quotes'
--]]
可以通過數值指定字串中的字符
- 數值轉義序列 \<XXX>
- <xxx>是一個至多三個十進制數字組成的序列
print('a' == '\97') -- true
- 用一對方括號 [[]] 可以包裹多行字串
- lua 就不會解釋其中的轉義序列
- 如輸入 html 代碼
page = [[
<html>
<head>
<title>Lua Study</title>
</head>
<body>
<a href=https://www.cnblogs.com/door-leaf/p/"http://www.lua.org">Lua 學習
