lua 中的函式是帶有詞法定界(lexical scoping)的第一類值(first-class values)。第一類值指:在 lua 中函式和其他值(數值、字串)一樣,函式可以被存放在變
量中,也可以存放在表中,可以作為函式的引數,還可以作為函式的返回值。詞法定界指:被巢狀的函式可以訪問他外部函式中的變數。這一特性給 lua 提供了強大的程式設計能力
根據table中的元素的某個屬性來給table排序
local mytable = ,,,
,}local function mysortbya(t1,t2)
return t1.a
在匿名函式內部的變數不是全域性變數也不是區域性變數,我們稱作外部的區域性變數(external local variable)或者 upvalue
(感覺有點類似c++中的靜態區域性變數,但又不完全一樣)
我們看一段**
function newcounter()
local i = 0
return function() -- anonymous function
i = i + 1
return i
endend
c1 = newcounter()
print(c1()) --> 1
print(c1()) --> 2
c2 = newcounter()
print(c2()) --> 1
print(c1()) --> 3
print(c2()) --> 2
c1、c2 是建立在同乙個函式上,但作用在同乙個區域性變數的不同例項上的兩個不同的閉包
個人感覺c1和c2是newcounter的兩個例項(或者說c1和c2是兩個全新的函式只不過實現都是newcounter),所以每次呼叫c1或c2的時候,外部的區域性變數i分別有自己的計數
lib = {}
lib.foo = function (x,y) return x + y end
lib.goo = function (x,y) return x - y end
lib =
lib = {}
function lib.foo (x,y)
return x + y
endfunction lib.goo (x,y)
return x - y
end
當我們將函式儲存在乙個區域性變數內時,我們得到乙個區域性函式,也就是說區域性函式像區域性變數一樣在一定範圍內有效。這種定義在包中是非常有用的:因為 lua 把 chunk當作函式處理,在 chunk 內可以宣告區域性函式(僅僅在 chunk 內可見),詞法定界保證了包內的其他函式可以呼叫此函式。下面是宣告區域性函式的兩種方式:
local f = function (...)
...end
local g = function (...)
...f() -- external local `f' is visible here
...end
local function f (...)
...end
尾呼叫是一種類似在函式結尾的 goto 呼叫,當函式最後乙個動作是呼叫另外乙個函式時,我們稱這種呼叫尾呼叫
function f(x)
return g(x)
end
由於尾呼叫不需要使用棧空間,那麼尾呼叫遞迴的層次可以無限制的。例如下面呼叫不論 n 為何值不會導致棧溢位(c++中會壓棧n次)
function foo (n)
if n > 0 then return foo(n - 1) end
end
以下幾種形式不是真正的尾遞迴
function f (x)
g(x)
return --丟棄 g 的返回值
endreturn g(x) + 1 -- must do the addition
return x or g(x) -- must adjust to 1 result
return (g(x)) -- must adjust to 1 result
lua中文教程 高階知識
一 編譯和執行和除錯 1 lua和其他解釋型語言一樣,先轉換成為中間碼再執行 2 dofile和loadfile的區別 loadfile編譯返回不執行,返回錯誤 dofile執行,返回錯誤資訊 3 loadstring通常用於程式外部的 load表示式,在前邊加上 return assert方法發出...
GEF中文教程 自學筆記 6
目標 建立連線 gef的連線 gef中的連線也被當成模型來看待。連線這種模型擁有起點source和終點target,它們都被稱為節點node。建立連線的步驟 1.建立連線模型connectionmodel及其控制器editpart 連線的控制器一般由org.eclipse.gef.editparts...
lua中文教程 第二章 型別和值
一 總覽 1 lua是動態型別語言,變數不需要型別定義。lua中有8個基本的型別,分別為 nil,boolean,number,string,userdata,function,thread,table。函式type可以測試給定變數的值或者型別。print type hello world stri...