Lua中文教程學習筆記 5 再論函式

2021-07-17 03:57:22 字數 2227 閱讀 5937

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...