亚洲成A人片在线观看网站_成年网站免费视频A在线双飞_日日日日做夜夜夜夜无码_久久夜色撩人精品国产小说

Lua 備忘清單

包含最(zui)重(zhong)要概念、函數、方(fang)法等的(de) 備(bei)忘單。 初學者的(de)完(wan)整快速(su)參考(kao)。

入門

下載

macos 使用(yong) homebrew 下載

$ brew install lua

其它下載方式

  • (sourceforge.net)
# 查(cha)看(kan) lua 是否安裝(zhuang)成功
$ lua -v

hello world

#!/usr/bin/env lua

print("Hello World!")

運行

$ lua ./hello.lua
# 或者也可以像(xiang) bash 腳本一(yi)樣
$ chmod +x hello.lua
./hello.lua

注釋

單行注釋

-- 以(yi)兩(liang)個減(jian)號開始

多行注釋

多行注釋以 --[[ 開頭, 以 ]] 結尾

--[[

]]

type() 函數

使用 type() 函數可以判斷變(bian)量(liang)或者值的類型

print(type(true)) -- boolean
print(type(nil)) -- nil

number

Lua 默認只有一種 number 類(lei)型 double (雙精度) 類(lei)型

print(10)
print(0.3)
print(2e + 10)

string

-- 使(shi)用 ''
local str1 = 'str1'
-- 使用 ""
local str2 = "str2"

[[]]

使用 [[]] 跨行表示多個字符串(chuan)

local html = [[
<html>
<head></head>
<body>
    <a href="//www.twle.cn/">簡單編程</a>
</body>
</html>
]]
print(html)

字符串連接(..)

print("a" .. 'b')
-- ab
print(157 .. 428)
-- 157428

字符串長度(#)

print(#"string") -- 6

table

local table = {}

迭代 table

默(mo)認的(de)初始索引會從 1 開始

local array = { "apple", "pear", "orange", "grape" }

print(array[1]) -- apple

for k, v in pairs(array) do
  print(k .. " : " .. v)
end
-- 1 : apple
-- 2 : pear
-- 3 : orange
-- 4 : grape

指定鍵

local array = {}
array.one = "apple"
array["two"] = "peach"

print(array.one) -- apple
print(array.two) -- peach

變量

默認值

變(bian)量的默(mo)認(ren)值均是 nil

#!/usr/bin/env lua
print(b) -- nil

全局和局部變量

Lua 中的(de)變量(liang)(liang)全(quan)是全(quan)局變量(liang)(liang),那怕是語(yu)句塊或是函數里(li),除(chu)非(fei)用 local 顯式聲明(ming)為局部變量(liang)(liang)

#!/usr/bin/env lua
function main()
  local b = 12
  a = 23
end

main()
print(a) -- 23
print(b) -- nil

賦值

a = "hello " .. "world" -- 改變(bian) 變(bian)量(liang)
t.n = t.n + 1  -- 改變(bian) table

-- 給多個變量賦值
a, b = 10, 2*a  --> a=10; b=20

交換變量

local x, y = 1, 3
x, y = y, x

print(x, y) -- 3, 1

local tab = {}
tab.one = 2
tab.two = 1

tab["one"], tab["two"] = tab.two, tab.one

print(tab.one, tab.two) -- 1    2

賦值個數不一致

  • 如果變量個數大于值的個(ge)數(shu),按變(bian)量個(ge)數(shu)補足 nil

    a, b, c = 1, 3
    print(a,b,c)      --> 1   3   nil
    
  • 如果變量個數小于值的(de)個數(shu),多余的(de)值會被忽略

    a = 1
    local a, b = a, a + 1, a + 2
    print(a, b) --> 1   2
    

運算符

:-:-
+加法
-減法
*乘法
/除法
%取余,求出除法的余數
^乘冪,計算次方
-負號,取負值
local a, b = 4, 3

print(a + b) -- 7
print(a - b) -- 1
print(a / b) -- 1.3333333333333
print(a * b) -- 12
print(a % b) -- 1
print(a ^ b) -- 64.0

類型轉換

  • 在算(suan)術運算(suan)中,string 類型會(hui)嘗試自動轉換為 number 時

    local a, b, c = "str", "1", "2"
    
    -- print(a + b) -- error
    print(b + c) -- 3
    
  • number 類型使用 .. 會(hui)自動轉換為(wei) string

    local a, b = 1, 2
    print(type(a .. b))
    
  • 其它方式的轉換

    print(type(tostring(12))) -- string
    print(type(tonumber("12"))) -- number
    

條件語句

運算符

關系運算符

符號含義
==等于
~=不等于
>大于
<小于
>=大于等于
<=小于等于
local a, b = 4, 3

print(a < b) -- false
print(a <= b) -- false
print(a == b) -- false
print(a ~= b) -- true
print(a > b) -- true
print(a >= b)-- true

邏輯運算符

符號含義
and邏輯與
or邏輯或操作符
not邏輯非操作符
local a, b = true, false
print(a and b) -- false
print(a and not b) -- true
print(a or b) -- true

while 循環

local num = 1
while (num < 5) do
  print("num 的(de)值為:", num)
  num = num + 1
end

if 語句

if(0)
then
    print("0 為 true")
end

if .. elseif() .. else

local age = 27;

if (age < 18)
then
  print("age 小于 18")
elseif (age < 25)
then
  print("age 小于 25")
elseif (age < 30)
then
  print("age 小于 30")
else
  print("age 大于 30")
end

print("age 的值為 :", age)

注意: Lua0true,但是 Lua 中的 nil 可以當作 false

for 循環

for i = 10, 1, -1 do
  print(i)
end
  • lua 中的 for 循環從參數 1 變化到參數 2,每次變化以參數 3 為步長遞增 i,并執行一次表達式
  • 參數三,是可選的,如果不指定,默認是 1
  • 參數二只會在一開始求值,其后不會再進行運算
local f = function(x)
  print("in f(x) ")
  return x * 2
end

for i = 1, f(5) do
  print(i)
end

repeat...until 循環

local num = 11
repeat
  print("num 的值為: ", num)
  num = num + 1
until (num > 10)
-- num 的值為:11

repeat...until 循(xun)(xun)環(huan)的(de)條件(jian)語句在當前(qian)循(xun)(xun)環(huan)結束后(hou)判斷

break

local num = 11
repeat
  print("num 的值為: ", num)
  num = num + 1
  if (num > 15) then
    break
  end
until (num > 20)

函數

初始化

像變量一樣,如果加上 local 那么就是局部函數

local function main()
  print("這是一個局部(bu)函(han)數")
end

你(ni)也可(ke)以將(jiang)函數賦(fu)值給一個變(bian)量

local main = function()
  print("這是一個局部(bu)函數(shu)")
end

返回值

local function min(a, b)
  if (a < b) then
    return a
  else
    return b
  end
end

print(min(1, 2))

參數

local p = function(res)
  print("打(da)印自己的風格", res)
end

local function main(a, b, p)
  p(a + b)
end

main(1, 2, p)

多個返回值

local function min(a)
  local sum = 0
  local factorial = 1
  for i, v in pairs(a) do
    sum = sum + v
    factorial = factorial * v
  end
  return sum, factorial
end

local a, b = min({ 1, 2, 3, 4 })

print(a, b)

可變參數(...)

local function average(...)
  local result = 0
  local arg = { ... }
  for i, v in ipairs(arg) do
    result = result + v
  end
  return result / #arg
end

print("平均值為", average(1, 3, 5, 7, 9, 11))

字符串

字符串方法

-- 全部(bu)轉換為大寫(xie)
string.upper("str") -- STR

-- 全部轉換為小寫
string.lower("STR") -- str

-- 指定(ding)替換的字符串個數(shu), 最后一個參數(shu)可選,默(mo)認(ren)是全(quan)部替換
string.gsub("aaaa", "a", "b", 3) -- bbba  3
string.gsub("Today is 29/01/2019", "%d%d/%d%d/%d%d%d%d", "good day.")
-- Today is a good day. 1

-- 查找第一個匹配的字符(fu)串,第三個參(can)數可(ke)以提供開(kai)始(shi)查找的位(wei)置,默認(ren)從 1 開(kai)始(shi)
-- 如(ru)果未找到,則返回 nil
string.find("referference", "fer") -- 3   5
string.find("Today is 29/01/2021", "%d%d/%d%d/%d%d%d%d") -- 10      19

-- 字符串(chuan)反轉
string.reverse("fw") -- wf

-- 格式(shi)化(hua)字符串
string.format("value:%c", 1) -- value:a

-- 轉(zhuan)換字符并拼接
string.char(97,98,99,100) -- abcd

-- 將字符轉(zhuan)化為(wei)整數值。 int 用來指(zhi)定(ding)某個字符,默認(ren)第一個字符
string.byte("ABCD",4) -- 68

-- 計算字符(fu)串(chuan)長度
string.len("abc") -- 3

-- 返回(hui)字符串的 n 個(ge)拷貝
string.rep("fw", n) -- fwfw

-- 剪切字(zi)(zi)符(fu)串,第三個參數可選,默認是(shi)字(zi)(zi)符(fu)串長度(du)
string.sub("referference", 5, 6) -- rf

正則匹配

:-:-
%a與任何字母配對
%c與任何控制符配對(例如\n)
%d與任何數字配對
%l與任何小寫字母配對
%p與任何標點(punctuation)配對
%s與空白字符配對
%u與任何大寫字母配對
%w與任何字母/數字配對
%x與任何十六進制數配對
%z與任何代表0的字符配對

match

第三個參數可選,默認從 1 開始。如(ru)果沒有捕獲組(zu)返回(hui)整(zheng)個字(zi)符串,匹配失敗返回(hui) nil

string.match(
  "I have 2 questions for you.", 
  "(%d+) (%a+) "
)  -- 2       questions

gmatch

返回(hui)一個(ge)迭(die)代(dai)器函(han)(han)數(shu),每次調(diao)用(yong)迭(die)代(dai)器函(han)(han)數(shu),如(ru)果參(can)數(shu) pattern 描述(shu)的(de)字符串沒有找到(dao),迭(die)代(dai)函(han)(han)數(shu)返回(hui)nil

for world in string.gmatch("I have 2 questions for you.", "%a+") do
  print(world)
end
-- I
-- have
-- questions
-- for
-- you

數學方法

常用方法

-- 一個比任何(he)數字都(dou)大的浮點數
math.huge

-- 最小值的整數
math.mininteger

local a = math.abs(-1) -- 1

-- 返回不小于該(gai)數(shu)到最小整數(shu)
local b = math.ceil(1.2) -- 2

-- 返回(hui)不大于該數到最(zui)大整(zheng)數
local c = math.floor(1.2) -- 1

-- 取余
local d = math.fmod(9.9, 9) -- 0.9

-- 返(fan)回最(zui)大(da)值(zhi)
local g = math.max(1, 2, 3) -- 3
-- 返回最(zui)小值
local h = math.min(1, 2, 3) -- 1

-- 返回參數的(de)平方根
local r = math.sqrt(3) -- 9

工具方法

-- 返回數字的類(lei)型,
local l = math.type(1.2) -- float
local m = math.type(3) -- integer
local n = math.type("") -- nil

-- 返回(hui)以指定底(di)底(di)對數
local e = math.log(4, 2) -- 2

-- 返回以 e 為底的自然對數
local f = math.exp(2) -- 7.3890560989307

-- 返回 [0,1) 區間內一致分(fen)布的(de)浮點偽隨機數
math.random()
-- 返(fan)回 [1, n] 區間內一致分布的(de)整數(shu)偽隨機(ji)數(shu)
math.random(10)
-- 返回 [n, m] 區(qu)間內(nei)一致(zhi)分布的整數偽隨(sui)機數
math.random(10, 100)

-- 無符(fu)號整數(shu)(shu)比較,參數(shu)(shu)一 小(xiao)于 參數(shu)(shu)二 則(ze)返(fan)(fan)回(hui) true,否則(ze)返(fan)(fan)回(hui) false
local o = math.ult(1, 10)

-- 如果參數可以轉(zhuan)換為一個(ge)整數,則返回(hui)該整數,否則返回(hui) nil
local p = math.tointeger("3") -- 3
local q = math.tointeger(0.32) -- nil

-- 返回整(zheng)數和小數部分
local i, j = math.modf(3.14) -- 3   0.14

其它方法

-- 圓周(zhou)率
math.pi -- 3.1415926535898

-- 正弦方(fang)法(以下皆是以弧度(du)表示)
math.sin(math.pi / 2) -- 1.0
-- 余弦方(fang)法(fa)
math.cos(math.pi) -- -1.0
-- 正切(qie)方法
math.tan(math.pi / 4) -- 1.0

-- 反(fan)正弦方(fang)法(fa)(以下皆(jie)是以弧度表(biao)示(shi))
math.acos(1.0) -- 0.0
-- 反余弦方法
math.acos(1.0) -- 1.5707963267949
-- 反正弦(xian)方法(fa)
math.atan(1.0) -- 0.78539816339745

-- 角度(du)轉換為弧度(du)
math.rad(90) -- 1.5707963267949
-- 弧度(du)轉換(huan)為角度(du)
math.deg(math.pi) -- 180.0

table

初始化數組

初始化一個空數組

local array = {} 

默認(ren)的(de)數(shu)組索引從 1 開始

local array = { "a", "b", "c", "d" }
array[5] = "e"

for i = 1, 5 do
  print(array[i])
end

多維數組

local array = {
  { "a", "b", "c" },
  { "d", "e", "f" }
}

for i = 1, #array do
  for j = 1, #array[i] do
    print(array[i][j])
  end
end

初始化 table

local table = {}

table.name = "fw"
table.age = "18"
table["sex"] = "boy"

-- 獲(huo)取(qu) table 的長度

print(#table) -- 3

-- 如果想要刪(shan)除一個(ge) table,那么可以使用 nil 賦值
table = nil
print(table)

table 方法

-- 用于(yu)連接 table 中(zhong)指定的(de)元素
-- table.concat(table [, sep [, start [, end]]])
local a = { "apple", "orange", "peach" }
print(table.concat(a, "->", 2, 3)) -- orange->peach

-- 用于向指定聞之插入元素。默認(ren)數組(zu)末尾
-- table.insert(table, [pos,] value)
local a = { "apple", "orange", "peach" }
table.insert(a, 1, "pear")
print(a[1]) -- pear

-- table.move(a1,f,e,t[,a2])
-- 表a1,a1下(xia)(xia)標開始位置f,a1下(xia)(xia)標結束位置e,t選擇移動到(dao)的開始位置(如果沒有a2,默認(ren)a1的下(xia)(xia)標)
local array = { "a", "b", "c" }

for i,v in pairs(table.move(array, 1, 3, 2)) do
  print(v)
end -- a a b c

-- table.sort (table [, comp])
-- 排序,默認是(shi)升序
local array = { "a", "c", "b" }

local f = function(a, b)
  return string.byte(a) - string.byte(b) > 0
end

table.sort(array, f)
for i, v in pairs(array) do
  print(v)
end -- c b a

迭代器

無狀態的迭代器

function square(d,n)
   if n < d
   then
      n = n + 1
   return n, n*n
   end
end

for i,n in square,5,0
do
   print(i,n)
end

for 循環迭代器

for i, n in pairs({ 1, 2, 3, 4 }) do
  print(i, n)
end

模塊

定義模塊

-- a.lua
local mod = {}

mod.cool = "this is a mod"
function mod.test()
  print("this is a function")
end

return mod

導入模塊

一般我們可以直接使用 require 導入

-- b.lua
-- local mod = require("a")
-- 使用 pcall 確保 require 函(han)數導入成功(gong),失敗則返回一(yi)個 false 狀態(tai)
local status, mod = pcall(require, "a")

if not status then
  return
end

mod.test()
print(mod.cool)

私有函數

local mod = {}

local function private()
  print("private")
end

function mod.public()
  private()
end

return mod

另見

  • (lua.org)
  • (wiki.luatos.com)
  • (twle.cn)