---
# System prepended metadata

title: Lua Manual
tags: [Lua]

---

# Lua Manual
> 本篇會以 C# 重度使用者的角度去看 Lua，謹慎服用

## 簡介
動態語言，與 C# 強型別類靜態語言不同，型別在 runtime 才決定，所以相對難在非 runtime 時發現問題。

---
## comment 註解
| | <font color=#FF0000> Lua </font> | C# | 快捷鍵 |
| -------- | -------- | -------- | -------- |
| 註解 | **\-\-**  | **//** | **Ctrl + /** |
| 長註解 | **\-\-\[\[ 多行內容 \]\]\-\-** | **/\* \*/** | **Shift + Alt + A** |

---
## modifier 修飾詞
:::danger
Lua 的存取修飾詞預設為全域 （不下 local）
:::

| | <font color=#FF0000> Lua </font> | C# |
| -------- | -------- | -------- |
| 全域 | **預設就是全域** | **public** |
| 區域 | **local** | **private** |

---
## keyword 關鍵字
| | <font color=#FF0000> Lua </font> | C# |
| -------- | -------- | -------- |
| 空值 | **nil** | **null** |
| 跳脫 | **break** | **break** |

---
## \_G 全域環境變數
詳情請見 **[這裡](https://www.jianshu.com/p/7b8ae23ecd81)**
* 保存 Lua 所有的 **Global Function** 與 **Global Variable**
* Lua 所有的 **Global Function** 與 **Global Variable** 會自動加進 **\_G**，**Local Function** 與 **Local Variable** 則不會
* 可以透過 **KeyValuePair** 的形式在 **\_G** 存放 **Local Function** 與 **Local Variable**

---
## operator 運算子
| | <font color=#FF0000> Lua </font> | C# |
| -------- | -------- | -------- |
| 不相等 | **~=** | **!=** |
| 或 | **or** | **||** |
| 且 | **and** | **&&** |
| 非 | **not** | **!** |

---
## method 方法
:::warning
推薦使用 <font color=#FF0000> 冒號 </font> 的寫法，對比點號寫法可以少一條指令，也比較簡潔，詳情請見 [這裡](https://zhuanlan.zhihu.com/p/115159195)
:::
| | <font color=#FF0000> Lua </font> | C# |
| -------- | -------- | -------- |
| 點號形式 | **function** myFunc **()** <br/> &emsp; do somthing <br/> **end** | **T** myFunc **()** <br/> **{** <br/> &emsp; do somthing <br/> **}** |
| 呼叫方式 | obj<font color=#FF0000> **.** </font>myFunc(<font color=#FF0000> **obj** </font>) | obj.myFunc() |
| 冒號形式 | **function** myFunc **(<font color=#FF0000> self </font>)** <br/> &emsp; do somthing <br/> **end** | |
| 呼叫方式 | obj<font color=#FF0000> **:** </font>myFunc() <br/> | |

---
## string 字串
| | <font color=#FF0000> Lua </font> | C# |
| -------- | -------- | -------- |
| 字串 | **'abcd'**, **"abcd"**, **\[\[abcd]]**, **\[=\[abcd]=]** 以上都一樣 | **"abcd"** |
| 字串拼接 | **"ab"\.\."cd"**  | **"ab" + "cd"** |
| 字串長度 | **#** 或 **string.len** 例：**#aa = 2** | **string.Length** |

---
## if 判斷式
| <font color=#FF0000> Lua </font> | C# |
| -------- | -------- |
| **if** 略 **then** <br/> &emsp; do somthing <br/> **end** | **if** **(** 略 **)** <br/> **{** <br/> &emsp; do somthing <br/> **}** |

---
## while 迴圈
| <font color=#FF0000> Lua </font> | C# |
| -------- | -------- |
| **while** 略 **do** <br/> &emsp; do somthing <br/> **end** | **while** **(** 略 **)** <br/> **{** <br/> &emsp; do somthing <br/> **}** |

---
## for 迴圈
| <font color=#FF0000> Lua </font> | C# |
| -------- | -------- |
| **for i = 0, 2** 略 **do** <br/> &emsp; do somthing <br/> **end** | **for ( var  i = 0; i < 2; i++ )** <br/> **{** <br/> &emsp; do somthing <br/> **}** |
| **for i = 0, 3, 2** 略 **do** <br/> &emsp; do somthing <br/> **end** | **for ( var  i = 0; i < 3; i += 2 )** <br/> **{** <br/> &emsp; do somthing <br/> **}** |

---
## do 迴圈
| <font color=#FF0000> Lua </font> | C# |
| -------- | -------- |
| **repeat** <br/> &emsp; do somthing <br/> **until** 略 | **do** <br/> **{** <br/> &emsp; do somthing <br/> **}** <br/> **while** **(** 略 **)** |

---
## iterate 迭代
:::danger
Lua 第一個 Index 為 1，不是 0
:::
| | <font color=#FF0000> Lua </font> | C# |
| -------- | -------- | -------- |
| 依序迭代 <br/> 從 1 開始依序尋找，直到找不到 <br/> 詳情請見 [這裡](http://huli.logdown.com/posts/198866-lua-table) | **for i, v in ipairs(t) do** <br/> &emsp; do somthing <br/> **end** |  |
| 無序迭代 | **for k, v in pairs(t) do** <br/> &emsp; do somthing <br/> **end** | **foreach (var kvp in t)** <br/> **{** <br/> &emsp; do somthing <br/> **}** |
| 清除迭代 | **t = nil** | **t.Clear()** |

---
## function 非固定參數數量
| | Lua | C# |
| ------- | ------- | ------- | 
| 類似概念 | **function A(...)**<br/> &emsp;print(arg[1])<br/>**end** | **public void A(params object[] args)**<br/>**{**<br/>&emsp;System.Console.WriteLine(args[0])<br/>**}** |
---
## try catch
1. [基本介紹](https://www.lua.org/pil/8.4.html)
2. **pcall** 執行的function **A** 如果有帶參數 **a, b, c** -> 執行 **pcall(A, a, b, c)**

---
## 如何將OO的概念導入lua ?
* [參考文章](https://www.lua.org/pil/16.html)

---

###### tags: `Lua`