lua非全域性函式
我們知道,Lua的函式不僅可以儲存在全域性的變數中,還可以儲存在區域性變數或者table的欄位中(大部分的Lua庫都採用了此種機制, 例如io.read,math.sin).若要在Lua建立此種區域性函式,有方法如下:
方法1:使用常規的函式語法與table語法相結合來建立區域性函式:
1 |
Lib
= {} |
2 |
3 |
Lib.foo
= function (x,
y) |
4 |
return x+y |
5 |
end |
6 |
7 |
Lib.goo
= function (x,y) |
8 |
return x-
y |
9 |
end |
方法2:使用構造式來建立區域性函式:
1 |
Lib
= |
2 |
{ |
3 |
foo
= function (x,
y) |
4 |
return x
+ y |
5 |
end , |
6 |
goo
= function (x,
y) |
7 |
return x
- y |
8 |
end |
9 |
} |
方法3:另類的方法建立區域性函式
1 |
Lib
= {} |
2 |
function Lib.foo(x,
y) |
3 |
return x
+ y |
4 |
end |
5 |
function Lib.goo(x,
y) |
6 |
return x
- y |
7 |
end |
上面的例子中建立區域性函式時都用到了table。下面看一些簡單的建立區域性函式的方法。
我們知道只要將一個函式儲存在一個區域性變數中,即可得到一個區域性函式(local function)。也就是說,該函式只能在特定的作用域使用。
例如:
1 |
local f1= function (<引數>) |
2 |
<函式體> |
3 |
end |
4 |
5 |
local g1= function (<引數>) |
6 |
<函式體> |
7 |
f1() --f1在這裡是可用的 |
8 |
end |
上面的建立函式還有個更便捷的模式:
1 |
local function f(<引數>) |
2 |
<函式體> |
3 |
end |
在建立區域性函式的時候,要明確其所在的作用域,看例子:
1 |
local fun
= function (x) |
2 |
if 0
== n then |
3 |
return 1 |
4 |
else |
5 |
return n*fun(n-1) --error,在呼叫時,編譯器會直接先呼叫fun的全域性函式。 |
6 |
end |
7 |
end |
上面的fun是個區域性函式,在呼叫fun(n - 1)時未定義,所以這裡是直接呼叫全域性的fun函式,而不是上面我們定義的區域性函式fun.。解決這個問題的辦法是,先定義一個區域性變數,再定義函式本身。
1 |
local fun --這裡先定義個區域性變數 |
2 |
fun
= function (x) --然後將函式賦值給區域性變數,使其成為一個區域性函式 |
3 |
if 0
== n then |
4 |
return 1 |
5 |
else |
6 |
return n*fun(n
- 1) |
7 |
end |
8 |
end |
為什麼上面的程式碼就不出錯,因為對於區域性函式的定義:
1 |
local function fun(<引數>) |
2 |
<函式體> |
3 |
end |
Lua在執行時將它展開為:
1 |
local fun |
2 |
fun
= function (<引數>) |
3 |
<函式體> |
4 |
end |
因此,針對上面的出錯的函式,可以這麼寫:
1 |
local function fun(n) --這裡直接建立了區域性函式 |
2 |
if n
== 0 then |
3 |
return 1 |
4 |
else |
5 |
return n*fun(n-1) |
6 |
end |
7 |
end |
總結一句:建立區域性函式的方法有上面那麼幾種,但是,個人感覺只需要記住下面最保守的這種即可:
1 |
local function fun(n) --這裡直接建立了區域性函式 |
2 |
if n
== 0 then |
3 |
return 1 |
4 |
else |
5 |
return n*fun(n-1) |
6 |
end |
7 |
end |
即在函式的定義中加個local識別符號
嗯,區域性函式的定義建立就寫到這裡為止。
相關文章
- lua全域性變數變數
- laravel 自定義全域性函式Laravel函式
- yaf框架載入全域性公共函式框架函式
- 在vue專案中 如何定義全域性變數 全域性函式Vue變數函式
- PHP 全域性使用 Laravel 輔助函式 ddPHPLaravel函式
- bind( )介面卡(Adapter) -- 呼叫全域性函式及成員函式APT函式
- PHP 到底該怎麼定義全域性函式?PHP函式
- vue 全域性函式的 定義與任意呼叫Vue函式
- 非線性支援向量機 與核函式函式
- C中呼叫Lua函式函式
- uniapp 全域性檢查登陸並跳轉函式APP函式
- (十一)KPCA非線性降維與核函式PCA函式
- setTimeout()函式中為什麼this指向全域性物件window函式物件
- Boostrap全域性CSS樣式CSS
- Bootstrap全域性樣式 - 表格boot
- elasticsearch + python 如何使用非全域性的 analyzerElasticsearchPython
- 本地索引、全域性索引、字首索引、非字首索引索引
- openresty及lua的隨機函式REST隨機函式
- lua 函式變數 assert判斷函式變數
- Laravel-自定義全域性函式-ChinaCircle 優化版Laravel函式優化
- 十二、變數作用域:區域性變數、全域性變數,函式版名片管理系統—新增函式文件變數函式
- 分散式全域性唯一ID分散式
- IE8 兩種全域性函式定義會有所不同函式
- 透過例子學習Lua(6)--C/C++中用Lua函式(轉)C++函式
- 函式之定義及全域性變數&區域性變數&風溼理論函式變數
- 轉 Lua標準庫: table函式, 數學函式, 字串函式/格式化/配對,函式字串
- 平凡的函式 線性篩積性函式函式
- uni-app全域性樣式和區域性樣式APP
- Lua——load和loadstring函式用法函式
- 分散式全域性ID生成方案分散式
- 《機器學習_07_03_svm_核函式與非線性支援向量機》機器學習函式
- ORACLE函式介紹第四篇 非著名函式之聚合函式Oracle函式
- Lua中呼叫ref和out修飾引數的函式/過載函式函式
- 一個用lua編寫的自定義函式函式
- Lua封裝函式模組並由其他模組呼叫封裝函式
- ORACLE函式介紹第二篇 非著名函式之單值函式Oracle函式
- ORACLE函式介紹第七篇 非著名函式之分析函式Oracle函式
- Ionic3全域性修改toast樣式AST