使用函数设置变量和表格 |
|
setfield函数的扩展 [1]。
此函数不仅确保已创建表格的存在,还会覆盖任何给定的表格/名称——我认为这是预期的。由于表格参数是通过引用传递的,因此您可以对任何本地表格使用setvar()。
function setvar(Table,Name,Value) -- Table (table, optional); default is _G -- Name (string); name of the variable--e.g. A.B.C ensures the tables A -- and A.B and sets A.B.C to <Value>. -- Using single dots at the end inserts the value in the last position -- of the array--e.g. A. ensures table A and sets A[table.getn(A)] -- to <Value>. Multiple dots are interpreted as a string--e.g. A..B. -- ensures the table A..B. -- Value (any) -- Compatible with Lua 5.0 and 5.1 if type(Table) ~= 'table' then Table,Name,Value = _G,Table,Name end local Concat,Key = false,'' string.gsub(Name,'([^%.]+)(%.*)', function(Word,Delimiter) if Delimiter == '.' then if Concat then Word = Key .. Word Concat,Key = false,'' end if type(Table[Word]) ~= 'table' then Table[Word] = {} end Table = Table[Word] else Key = Key .. Word .. Delimiter Concat = true end end ) if Key == '' then table.insert(Table,Value) else Table[Key] = Value end end
测试
> Test = {}
> setvar(Test,'Index',1)
> setvar(Test,'Index.',22)
> setvar(Test,'Index.Index',333)
> table.foreach(Test,print)
Index table: 0x689668
> table.foreach(Test.Index,print)
1 22
Index 333
>
> setvar(Test,'Index.Index.',4444)
> setvar(Test,'Index.Index.',4444)
> setvar(Test,'Index..',55555)
> setvar(Test,'Index..Index',666666)
> setvar(Test,'Index..Index.',7777777)
> setvar(Test,'Index..Index..',88888888)
> table.foreach(Test,print)
Index..Index.. 88888888
Index.. 55555
Index table: 0x689668
Index..Index table: 0x684258
> table.foreach(Test.Index,print)
1 22
Index table: 0x686270
> table.foreach(Test['Index..Index'],print)
1 7777777
>
> setvar(Test,'.Index',999999999)
> table.foreach(Test,print)
Index..Index.. 88888888
Index.. 55555
Index 999999999
Index..Index table: 0x684258
>
> setvar(Test,'',0)
> table.foreach(Test,print)
1 0
Index..Index.. 88888888
Index..Index table: 0x684258
Index 999999999
Index.. 55555