- 
                Notifications
    You must be signed in to change notification settings 
- Fork 11
MetaTablesInCSharp
In Lua you can assign a Metatable to a table to specify the behaviour in unsupported cases. E.g. you can specify what happens, if you try to add to tables, try to
access a non-existent field, etc. If this concept is new to you, you might have a look to the corresponding Lua Wiki Entry
When using a DynamicLuaTable that represents a Lua table, that has an associated Metatable, you can use this Metafunctions in C# like you would expect. I.e. when you implement
the __add-Metamethod, you can add these tables in C# just like numbers.
The following Metamethods are currently supported:
| Metamethod | C# code to use it | Notes | 
|---|---|---|
| __add,__sub,__mul,__div | a + b,a - b,a * b,a / b | |
| __mod | a % b | |
| __pow | a.Power(b) | Can be used from VB, etc natively with a^b | 
| __eq | a == b,a != b | For "not equal" the result will be negated (if it's bool) | 
| __lt,__le | a < b,a <= b,a > b,a >= b | For "bigger then" operations, the operands will be switched | 
| __call | a(b) | |
| __index | a.b,a[b] | |
| __newindex | a.b = c,a[b] = c | |
| __unm | -a | |
| __tostring | a.ToString() | 
The following Metamethods are currently not supported:
| Metamethod | Notes | 
|---|---|
| __concat | There is no special concat operator in C#, addition and concatenation is done with the plus sign ( +) | 
| __len | There is no len operator in C# | 
This in Example a Metamethod __index is created, mapping the square of each number to the corresponding table entry.
dynamic tab = lua.NewTable("tab");
dynamic mt = lua.NewTable("mt");
mt.__index = new Func<dynamic, string, double>((t, i) => Math.Pow(int.Parse(i), 2));
tab.SetMetatable(mt);
for (int i = 0; i <= 10; i++)
{
      Console.WriteLine(tab[i]); //Prints 0,1,4,9,etc.
}The Metamethod is implemented as a lambada Function in C#. It takes two arguments, the table t and the index i. The table has the type dynamic (but is an instance if LuaTable, see issue #4), the index is a string. The return value is double, the CLR type for the Lua type number.
In this example, a simple "class" is created (this time in Lua), both representing basically two numbers, and implementing a __add Method
in their Metatable. With this setup you can add these two classes in C#.
lua("c1 = { num = 42 }; c2 = { num = 7 }");
lua("mtc = { __add = function(t, other) return t.num + other.num end }");
lua("setmetatable(c1, mtc)");
lua("setmetatable(c2, mtc)");
Console.WriteLine(lua.c1 + lua.c2); //Prints 49