又LAG隨性筆記
  • 關於我
  • 作品集
  • 生活隨筆
  • 與我聯絡
  • 隨手扎

隨手扎

September 24, 2020

【30天Lua重拾筆記11】基礎1: 註釋

基礎2: 註釋

--[[
{
  author = "lagagain",
  date = 20200904,
  title = "Comments of Lua code",
} 
--]]

註釋是一段永遠不會被執行的區塊。你可以在註釋區塊隨意寫任何東西,而不必遵守任何Lua的語法規則。但更好的,註釋應該是作為程式碼的部份補充。至今為止的幾天,其實也過不少註釋。像是:

------------------

阿勒? 😲 這不是分隔線嗎?

單行註釋

是的,最基本的單行註釋以 -- 開頭,直至行尾都會被視為註釋。也看過:

do
  local a = 1
  local b = 2
  local sum = a + b -- sum = 1 + 2 => 3
end

或是

print("Hello, World") -- Output: Hello, World

本系列會部份以這樣方式去說明程式碼,程式碼的執行結果。不過在寫註釋時,最好是明確的補充程式碼的意義,像是:

September 23, 2020

【30天Lua重拾筆記10】基礎1: 類型 - 布林和nil

nil

nil是Lua裡的一個特殊值,代表什麼也沒有。其型別也是nil

type(nil) -- => nil

布林

布林值只有true和false

真值

只要不是nil或是false都為真, 包含0、空表、空字串 。

這與目前多數主流語言不同,需要特別注意!

September 22, 2020

【30天Lua重拾筆記09】基礎1: 類型 - 函數

函數 宣告

函數可以使用function來做宣告,並以end結束。

function hello()
  print("Hello, World")
end

實際上這是Lua的語法糖,上面相當於:

hello = function()
  print("Hello, World")
end

函數也是第一公民

在Lua,函數是第一公民,是基本型別,可以榜定於變數,也可以作為參數傳遞,或是回傳 值。

function genFun()
  return function()
    print("Hello, World")
  end
end


function callFun(f)
  f()
end


local _f = genFun() -- # get a function
callFun(_f) -- print("Hello, World")

函數、區域變數與閉包

函數同時也是一個區塊,可以保有區域環境變數,這樣的特性可以用來做閉包。

September 22, 2020

【30天Lua重拾筆記08】基礎1: 類型 - 字串

關於字串

與Python相同,字串是不可變得。但Lua字串於內部表示時,完全採用8-bits表示,包含0(\0)。這也是為什麼在基礎1: 變數一篇,會特別說明\u{1F603}的使用。

所以字串如果取其長度,可能和你想像的不一樣:

-- note: with UTF-8
print(string.len("我")) -- equal print(#"我") => 3

不過Lua是認得UTF-8的,其本身可以協助不支援UTF-8的程式語言(ex: C語言)。

-- note: with UTF-8
print(utf8.len("我")) -- => 1

C90包含<wchar.h>; C11有<uchar.h>。
儘管如此,不表示就是UTF-8

寬字元(Wide character) 是電腦抽象術語(沒有規定具體實現細節),表示比8位元字元還寬的資料類型。不同於Unicode。 – 維基百科

因為Lua認得UTF-8,所以其原始碼最好以UTF-8儲存,否則可能執行會與想像不同。

字串的表示式

要表示字串在Lua有多種方式。

字面字串

簡單表示

September 20, 2020

【30天Lua重拾筆記07】基礎1: 類型 - 數字

整數與小數

數字(number)是Lua的基礎型別之一。Lua會自動判斷是整數還是小數,會自動轉換,無明確分界。

1.0 == 1
list = {"Bob", "Lua", "Luna", "Selene"}
list[1] == list[1.0]
type(1.0) -- => number
type(1) -- => number

雖然會自動轉換,不代表沒有區別

math.type(1.0) -- => float
math.type(1) -- => integer

溢位(overflow)

Lua 5.4使用64位元的整數和浮點數(雙精度浮點數double)。

math.type(9223372036854775807) -- => integer
math.type(9223372036854775808) -- => float

這表示Lua還是有可能溢位

9223372036854775807 + 1 -- => -9223372036854775808

精度丟失

浮點數的表示也有極限,可能會有精度丟失的問題

September 19, 2020

【30天Lua重拾筆記06】基礎1: 變數

變數名稱

Lua的變數名稱可以是底線(_)或是任意字母([a-zA-Z])開頭,不能是數字或其他字元。之後的組成可以包含數字([0-9])、字母([a-zA-Z])或底線,並且是大小寫敏感,abc、Abc、ABC可以作為三個不同的變數。

Lua作為嵌入型語言,使用最基本的ascii code。儘管其本帶有utf8函式庫,也可能有部份實現允許其他字元作為變數名稱,但不建議這樣做,並且在使用到非ascii字元時,最好以\u{1F603}這樣方式來寫。像是:

print("\u{1F603}")
print('😃')

上面兩著等價,或是下面兩者亦相同。

print("\u{4f60}\u{597d}\u{ff0c}\u{4e16}\u{754c}\u{ff01}")
print("你好,世界!")

當然其實Lua是了解utf-8的,本系列也不會以上述方式撰寫,所以請確定儲存的程式檔案是以utf-8儲存,否則執行結果可能不如預期。

此外,Lua的底線開頭的變數,和Python一樣有時也代表一些意義,這會在說道metatable和物件導向程式設計時說明。

變數可見範圍

與多數程式語言一樣,分有全局變數和局部變數。不同的是,預設變數可見範圍是全局的(類似JS的var變數)。

g1 = 1
function f()
  print(g1)
  g2 = 2
end

f()
print(g2)
  • ««
  • «
  • 1
  • 2
  • 3
  •  … 
  • 17
  • 18
  • 19
  •  … 
  • 34
  • »
  • »»
© 又LAG隨性筆記 2025