IT練習ノート

IT関連で調べたこと(実際は嵌ったこと)を書いています。

Luaのtableの自己参照

luaのテーブルはオブジェクトのように扱えますが、下の例のように自己参照はできません。

> Any = {
>>   AnyType = {
>>      [1] = "SCALAR"
>>     ,[2] = "OBJECT"
>>     ,[3] = "ARRAY"
>>   }
>>   , [1] = {attr = "required" , type = "Type"   , name = "Any.type" , tag = 1, convert = Any.enum_fun} -- ここで自分自身の関数を参照したい
>>   , [2] = {attr = "optional" , type = "Scalar" , name = "scalar"   , tag = 2}
>>   , [3] = {attr = "optional" , type = "Object" , name = "obj"      , tag = 3}
>>   , [4] = {attr = "optional" , type = "Array"  , name = "array"    , tag = 4}
>>   , enum_fun = function(v) return AnyType[v] end
>> }
stdin:7: attempt to index global 'Any' (a nil value)
stack traceback:
    stdin:7: in main chunk
    [C]: in ?
>

当然thisはない。

> Any = {
>>   AnyType = {
>>      [1] = "SCALAR"
>>     ,[2] = "OBJECT"
>>     ,[3] = "ARRAY"
>>   }
>>   , [1] = {attr = "required" , type = "Type"   , name = "Any.type" , tag = 1, convert = this.enum_fun}
>>   , [2] = {attr = "optional" , type = "Scalar" , name = "scalar"   , tag = 2}
>>   , [3] = {attr = "optional" , type = "Object" , name = "obj"      , tag = 3}
>>   , [4] = {attr = "optional" , type = "Array"  , name = "array"    , tag = 4}
>>   , enum_fun = function(v) return AnyType[v] end
>> }
stdin:7: attempt to index global 'this' (a nil value)
stack traceback:
    stdin:7: in main chunk
    [C]: in ?
>

一旦定義を作っておいて、後から追加すれば、それ相当のことができる。

> Any = {
>>   AnyType = {
>>      [1] = "SCALAR"
>>     ,[2] = "OBJECT"
>>     ,[3] = "ARRAY"
>>   }
>>   , [1] = {attr = "required" , type = "Type"   , name = "Any.type" , tag = 1}
>>   , [2] = {attr = "optional" , type = "Scalar" , name = "scalar"   , tag = 2}
>>   , [3] = {attr = "optional" , type = "Object" , name = "obj"      , tag = 3}
>>   , [4] = {attr = "optional" , type = "Array"  , name = "array"    , tag = 4}
>>   , enum_fun = function(v) return AnyType[v] end
>> }
> Any[1].convert = Any.enum_fun
> = Any[1]
table: 0x7fc353f017f0
> return  Any[1].attr
required
> return  Any[1].type
Type
> return  Any[1].name
Any.type
> return  Any[1].tag
1
> return  Any[1].convert
function: 0x7fc353f016d0

参考

How to reference lua table member from table member? - Stack Overflow