發表文章

目前顯示的是 7月, 2019的文章

[Lua] 敘述-Lua 新手村 (4)

還記得我們曾經在新手村 (1) 提到 chunk(組塊)這個詞嗎?當時還提到,所謂 chunk 是由很多 statement(敘述)組合在一起的,而那時我對敘述的解釋是,一行程式碼就是一個敘述,但其實,這個說法不太精確,而我們這一篇文章將會來談談 Lua 中有哪些敘述。 敘述 Statement  敘述又稱作 陳述式 ,所有敘述都會造成一個效果,而這個效果要視我們使用了哪一種敘述而定。在 Lua 中,敘述分為:指定、local 宣告、block、控制結構、函式宣告及呼叫,還有 return、break 敘述 1 。  而控制結構裡包含了 if、while、repeat、for 等敘述,是我們這篇的主角。  註1 :Lua 5.2 裡還多了 goto 敘述。 指定 Assignment  指定又稱 指派 ,是改變變數值最基本的方法。普通的指定我們已經看過很多了,接著來看看 Lua 裡所謂的「多重指定」: a, b = 12, 78 a 12 b 78  我們可以一次把多個值指定(分配)給多個變數,像上例這樣。我們可以利用這個特性,寫出簡潔有力的兩變數交換: a, b = 12, 78 a, b = b, a print(a, b) 78 12  當然,也可以對 table 的欄位(field)進行這樣的操作: ary = { hi=19, sky=36 } ary['hi'], ary['sky'] = ary['sky'], ary['hi'] ary['hi'] 36 ary['sky'] 19  不過,如果左方變數跟右邊值的數量不一樣的話呢? a, b = 1, 2, 3, 4 -- 3、4 被丟棄 (discard) print(a, b) 1 2 a, b, c, d = 7, 8 -- c、d 補 nil print(a, b, c, d) 7 8 nil nil  多出來的值被丟棄,多出來的變數被補 nil,請牢牢記住這個規則,這在我們之後講到函式時很重要。 Local 宣告與區塊(Block)  我們之前所使用的變數都是屬於全域(global)變數,也就

[Lua] 運算式-Lua 新手村 (3)

在上一章我們看到了很多種型別以及他們的值,但是我們該如何運用他們呢?一個方法就是透過即將要介紹的各種運算子來組合成更複雜的值,也就是所謂的「運算式」。 運算式 Expression  運算式又稱作 表示式 ,他代表了值,在 Lua 中,運算式可以是簡單的值、變數、包含運算符號的式子,以及函式的呼叫,甚至是函式定義和 table 的建構,在這篇文章裡,我們會提到上述除了 函式定義之外的運算式類型。 簡單的值  這個分類是我為了讓讀者容易理解而使用的分類,只要是上一篇文提到的值都算在此類。舉凡 nil、true、false、各種 number,以及字串實字(Literal),也就是由單雙引號或雙中括號包起來的字串。 變數  變數我們在上一篇文已經看過很多了,變數自己是一個運算式,而他也可以透過下面要介紹的運算符號來組成更複雜的運算式。 運算子 Operator  運算子也就是我們熟悉的運算符號,像是 +、-、*、/ 之類的,不過在 Lua 裡,還有更多種運算子。 算數(Arithmetic)運算子  算數運算子包含以下數種: + (加) - (減) * (乘) / (除) % (模除) ^ (指數) - (負數)  我們來簡單看看要怎麼使用他們: 12 + 75 87 36 - 19 17 3 * 5 * 7 105 9 / 3 3 2 / 7 0.2857142857142857 8 % 5 3 -79 % 4 1 6 ^ 2 36 (-4) ^ 3 -64  注意「%」這個運算子的作用,他是由下面這條等式所定義的,其中 math.floor(x) 這個函式可以取得不大於 x 的最大整數: a % b == a - math.floor(a/b)*b  特別的是,% 也可以用在整數以外的運算: math.pi 3.1415926535... math.pi % 1 0.1415926535... math.pi % 0.01 0.0015926535... p = math.pi print(p - p % 0.01) 3.14  如果你有仔細看,會發現上面有一條等式裡使用了「==」,這跟一個等於 = 差在哪呢?這就是我們接下來的主題:關係運算子。 關係(

[Lua] 型別與值-Lua 新手村 (2)

接下來要談談 Lua 裡的資料型別還有所謂的「值」。由於 Lua 是個動態語言,所以變數本身並不帶有型別資訊。嗯?這是什麼意思? 動態語言  不過這篇文畢竟是新手村,所以不會講得太深入,有興趣的讀者可以自行深入了解。  所謂的動態語言就是,同一個變數裡的資料可以現在是一個數字,等一下又是一個字串,這樣能夠動態地轉換型別的語言就叫做動態語言。不過剛剛提到的變數 (Variable) 跟型別 (Type) 到底是什麼? 變數、型別與值  簡單的說,變數就像一個紙箱,並沒有規定裡面要裝什麼,可以裝任何你想裝的物品,而「值(Value)」就是能被裝入變數這個箱子的物品,那麼這個物品的類型就是型別。  舉個例子,如果我有一個紙箱(變數),然後我把香蕉裝進去,那麼這個香蕉就是「值」,而他的類型(型別)就是水果。而且,我可以之後把裡面的香蕉換成白菜,如此一來,值就變成了白菜,而型別就變成了蔬菜,不過紙箱(變數)還是 同一個 。  而在 Lua 中要把一個值給一個變數,只要這樣寫就好: box = 1024 這行中間的等於「=」就是所謂的指定,也就是把右邊的值放到左邊的變數裡面,這裡的變數叫做「box」,而值是「」1024」 Lua 中的型別  Lua  中的資料型別只有 8 種,分別是 nil(無)、 boolean ( 布林 )、 number ( 數字 )、 string ( 字串 )、 function ( 函式 )、 table ( 表 )、 thread ( 執行緒 )、 userdata ( 使用者資料 ),接下來會大致講解每種型別。 nil  nil 是一個很重要的型別,而且我們在上一篇也遇過他,代表著「什麼都沒有」。屬於 nil 這個型別的值只有一個,就是nil。 boolean、number、string  boolean 型別是拿來表示條件 1 的型別,只有兩個值:true 和 false,但這不代表只有這兩個值可以拿去當作條件式使用:在 Lua 中,除了 false 和 nil 代表 false(條件的假)之外,其他值都是 true (條件的真) ,包括 0 和空字串。  註1 :關於條件,會在下幾篇文章進行更深入的解說。  number 就是一般數值的型別,無論是整數