使用函数设置变量和表格

lua-users home
wiki

以下是“Programming in Lua”一书中“14.1. 使用动态名称访问全局变量”部分中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

--MarkusHuber


最近更改 · 偏好设置
编辑 · 历史记录
最后编辑于 2007 年 5 月 28 日下午 10:56 GMT (差异)