在table中儲存nil值

2021-10-11 01:39:23 字數 1382 閱讀 9667

在table中,nil不可以作為key,否則會有執行報錯;而且,有時候使用#獲取長度時,會因為nil而導致無法獲取到正確的長度;如下,有乙個函式,它是用來把引數進行反序,使用#獲取長度,但是長度出現了問題;

function reverse(...)

local t =

for i = 1,#t/2 do

local j = #t - i + 1

t[i],t[j] = t[j],t[i] -- swap

endreturn table.unpack(t)

endprint(reverse(10, 20, 30))

print(reverse(10, nil, 30, nil))

print(nil, 30, nil, 10)

print(table.unpack())

解決方案:可以使用乙個顯式的'n'字段,如下,不是直接用...建立乙個表,而是另外儲存乙個長度字段:

function reverse(...)

local t =

for i = 1, t.n / 2 do

local j = t.n - i + 1

t[i], t[j] = t[j], t[i]

endreturn table.unpack(t, 1, t.n)

endprint(reverse(10, 20, 30))

print(reverse(10, nil, 30, nil))

使用nil佔位符

在一些特殊的例子中,我們需要使用nil作為key,可以使用如下的替代方案,封裝一層介面,將nil作為引數傳入,如果為nil,則使用另乙個nil來代替並進行索引;

do

local nil = {}

function set_create(...)

local t = {}

for n = 1, select('#', ...) do

local v = select(n, ...)

t[v == nil and nil or v] = true

endreturn t

endfunction set_exists(t, v)

return t[v == nil and nil or v]

endendlocal t = set_create(10, nil, false)

assert(set_exists(t, 10))

assert(set_exists(t, nil))

assert(set_exists(t, false))

assert(set_exists(t, 'xx'))

資料在堆疊中儲存方式

一 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注malloc,calloc,new申請的...

jQuery在div中儲存核取方塊值的列表

只是說您想將列表儲存在文字區域中,以便在選中核取方塊時將其新增到列表中。同樣,當取消選中核取方塊時,將從列表中刪除該專案。這就是您可能要做的如此瘋狂的事情!when a user selects interest in an addtional service,add this to the add...

在檔案中儲存 Python 物件 轉換

把多種python物件寫入乙個文字檔案的各行 要使用轉換工具把物件轉成字串,文字資料在指令碼中一定是字串,而寫入方法不會自動地做任何到字串的格式轉換工作。x,y,z 43,44,45 s spam 必須是字串才能儲存在檔案中 d l 1,2,3 f open datafile.txt w 建立輸出檔...