2016-02-28 46 views
1

將數字轉換爲表格的最有效方法是什麼?或者是否有可能製作一個表沒有迴路如何在lua中初始化表格大小

local t = 10 -- given number 
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} -- result 

更新:t變量是可變數字,我想爲每個值。

t = 3 

function foreach(f, t) 
    for i, v in ipairs(t) do 
    f(v) 
    end 
end 

foreach(print, t) 
1 
2 
3 

我需要一個最快的方式new Array(n)在Lua。或者沒有任何意義?

+2

你能與我們分享,你爲什麼會想這樣的表?如果你唯一的目標是要有一個長度爲10的表,但它不會有10個元素,那麼可以使用'table.setn'。 –

+0

你可以將'lua_createtatble'輸出到Lua。 table.setn是depricated,只是設置'n = x',但不分配內存(我不知道這一點)。但我真的建議在執行任何實施之前進行性能測試。 – moteus

+0

@SebastianHoffmann感謝您的評論。我想避免這個例子中的雙循環。但是我得到了'foo = {};打印(table.setn(foo,10))' stdin:1:嘗試調用字段'setn'(一個零值) 堆棧回溯: stdin:1:在主區塊中 [C]:in? ' – jackson555

回答

2

也許你不知道該怎麼回答@塞巴斯蒂安的問題。這裏有幾個讓你思考的選擇。

由於您的表只包含計算元素,因此您可以省略存儲並僅對每個讀取訪問執行計算(index操作)。

local function newArray(size) 
    local t = {} 
    setmetatable(t, { 
      __index = function (_, i) 
       return i >= 1 and i <= size and i or nil end}) 
    return t 
end 

t10 = newArray(10) 
for i = 0, 11 do -- ipairs won't work as expected with such a table 
    print(i, t10[i]) 
end 
t10[2] = "stored values override __index" 
print(t10[2]) 

當然,您也可以用只返回值的身份函數或甚至只是一個身份表達式替換表。但是,也許您對錶格有一個未表達的要求,或者您需要ipairs來重複序列。

說到迭代器,

local function seq_itor(first, last) 
    local i = first - 1 
    return function() 
     i = i + 1 
     if i <= last then return i end 
    end 
end 

for i in seq_itor(1, 10) do 
    print(i) 
end 
2

這樣做將是定義一個函數的最簡單方法:

function newArray(size) 
    local t = {} 
    for i = 1, size do 
     t[i] = i 
    end 
    return t 
end