2012-05-31 36 views
2

在lua中是否有任何多重任務的方式,使右側的缺失值不被視爲零?lua多項任務

不便類似於

 a,b,c = 1 

但得到

 a = 1, b = 1, c = 1 

的結果。

不幸的是,

a = b = c = 1 

不起作用。

我需要這個,因爲我可能在右側有複雜的表格,我想保持簡短(沒有任何附加變量)。

回答

3

不,這個AFAIK沒有捷徑。

此外,這可能不會像你想要的表值的方式工作。

local some_tbl = {a = 1, b = 2, c = 3} 
-- you just assigned the same table to both variables 
local a,b = some_tbl, some_tbl 

a.a = 5 

print(a.a, b.a) 

上面的代碼輸出:

>lua -e "io.stdout:setvbuf 'no'" "junk.lua" 
5 5 

你只是改變了兩個變量表(這可能不是你想要的值,你可能想分配給每個相同的表定義變量,但每個表都包含不同的數據)。

當我有代碼,我正在與單獨的表結構的副本工作,我寫了一個getter函數返回具有相同定義的新副本。這要是在代碼中使用上面,應該是這樣的:

function get_TableLayout1() 
    -- return separate copies of the same table layout 
    return {a = 1, b = 2, c = 3} 
end 

local a,b = get_TableLayout1(), get_TableLayout1() 

a.a = 5 

print(a.a, b.a) 

打印出:

>lua -e "io.stdout:setvbuf 'no'" "junk.lua" 
5 1 

預期。

+1

我不需要單獨的副本,您提供的示例以我需要的方式工作。我只是不喜歡有額外的變量。 – nil

2

你可以使用一個函數:

local a,b,c = (function(t) return t,t,t; end)({1,2,3}); 

不過,我寧願顯而易見的解決方案:只要用兩行

local a = {1,2,3}; 
local b,c = a,a; 
3

都能跟得上。你的第一個例子(多任務)已經有了明確定義的語義,所以Lua需要一個額外的運算符/關鍵字/來表示對不同語義(重複最後一個r值)的渴望。它沒有。

你的第二個例子(將任務鏈接在一起,ala C)需要賦值爲表達式,而在Lua中則是語句。


你可以得到將被定義是推動一個值壓入堆棧一堆次功能最接近:

function push(x) 
    return x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x 
end 

然後,你可以說:

a,b,c,d,e,f,g = push(t) 

但是,這漂亮的kludgey。


出於好奇,爲什麼你需要一堆不同的引用到同一個表中的同一個表?

+0

我想調用一個C函數傳遞參數作爲表。例如,cfun({param1 = true,param2 = 1000,param3 = {subparam1 = {sububparam1 = 0,sububparam2 = 1,sububparam3 = 0.5},subparam2 = {sububparam1 = 0,sububparam2 = 1,sububparam3 = 0.5}}} ) – nil

+0

一個解決方法是,我允許在具有相同值的幾個則params的情況下寫的附加方式: 'CFUN({ 參數1 =真, param2的= 1000, 參數3 = { {subparams = {subparam1,subparam2 },{subsubparam1 = 0,subsubparam2 = 1,subsubparam3 = 0.5}},{ = subparams subparam3,{subsubparam1 = -10,subsubparam2 = 10,subsubparam3 = 5}}} } ) ' – nil

+0

另一種情況,在這裏您可能需要多重賦值:'local head = linkedlist();本地尾巴=頭部;尾尾=:推(VAL)'。你需要兩個變量開始指向同一個表,儘管稍後可能會改變。 – Phrogz