在lua中是否有任何多重任務的方式,使右側的缺失值不被視爲零?lua多項任務
不便類似於
a,b,c = 1
但得到
a = 1, b = 1, c = 1
的結果。
不幸的是,
a = b = c = 1
不起作用。
我需要這個,因爲我可能在右側有複雜的表格,我想保持簡短(沒有任何附加變量)。
在lua中是否有任何多重任務的方式,使右側的缺失值不被視爲零?lua多項任務
不便類似於
a,b,c = 1
但得到
a = 1, b = 1, c = 1
的結果。
不幸的是,
a = b = c = 1
不起作用。
我需要這個,因爲我可能在右側有複雜的表格,我想保持簡短(沒有任何附加變量)。
不,這個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
預期。
你可以使用一個函數:
local a,b,c = (function(t) return t,t,t; end)({1,2,3});
不過,我寧願顯而易見的解決方案:只要用兩行
local a = {1,2,3};
local b,c = a,a;
都能跟得上。你的第一個例子(多任務)已經有了明確定義的語義,所以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。
出於好奇,爲什麼你需要一堆不同的引用到同一個表中的同一個表?
我想調用一個C函數傳遞參數作爲表。例如,cfun({param1 = true,param2 = 1000,param3 = {subparam1 = {sububparam1 = 0,sububparam2 = 1,sububparam3 = 0.5},subparam2 = {sububparam1 = 0,sububparam2 = 1,sububparam3 = 0.5}}} ) – nil
一個解決方法是,我允許在具有相同值的幾個則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
另一種情況,在這裏您可能需要多重賦值:'local head = linkedlist();本地尾巴=頭部;尾尾=:推(VAL)'。你需要兩個變量開始指向同一個表,儘管稍後可能會改變。 – Phrogz
我不需要單獨的副本,您提供的示例以我需要的方式工作。我只是不喜歡有額外的變量。 – nil