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