使用函数设置变量和表格 |
|
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