The LuaValue class is the core data type in SolarSharp, representing any value in Lua. It can hold different types of data including numbers, strings, booleans, tables, functions, and more.
LuaValue is a wrapper that can represent any Lua type:
using SolarSharp.Interpreter.DataTypes;Script script = new Script();LuaValue result = script.DoString("return 42");Console.WriteLine(result.Type); // DataType.NumberConsole.WriteLine(result.Number); // 42
LuaValue value = script.DoString("return { x = 10, y = 20 }");switch (value.Type){ case DataType.Nil: // No accessible value break; case DataType.Boolean: bool b = value.Boolean; break; case DataType.Number: double n = value.Number; break; case DataType.String: string s = value.String; break; case DataType.Table: Table t = value.Table; break; case DataType.Function: Closure f = value.Function; break; case DataType.ClrFunction: CallbackFunction cb = value.Callback; break; case DataType.Thread: Coroutine co = value.Coroutine; break; case DataType.Tuple: LuaValue[] values = value.Tuple; break; case DataType.UserData: UserData ud = value.UserData; break;}
Accessing the wrong property for a type (e.g., value.Number when Type is String) will return default values or null. Always check the Type first.
LuaValue value = script.DoString("return 42");// Generic conversionobject obj = value.ToObject();// Typed conversionint number = value.ToObject<int>();double d = value.ToObject<double>();string s = value.ToObject<string>();// Specific type conversionobject specificType = value.ToObject(typeof(int));
LuaValue value = LuaValue.NewNumber(42);// Cast to string (similar to Lua's behavior)string? str = value.CastToString(); // "42"// Cast string to numberLuaValue strValue = LuaValue.NewString("3.14");double? num = strValue.CastToNumber(); // 3.14// Cast to boolean (false for nil/false, true for everything else)bool b = value.CastToBool(); // true
using SolarSharp.Interpreter.Errors;LuaValue value = LuaValue.NewString("not a number");try{ // Will throw if not the expected type value.CheckType("myFunction", DataType.Number, argNum: 1);}catch (ScriptRuntimeException ex){ Console.WriteLine(ex.Message); // "bad argument #1 to 'myFunction' (number expected, got string)"}// With auto-conversionLuaValue converted = value.CheckType( "myFunction", DataType.Number, argNum: 1, flags: TypeValidationFlags.AutoConvert);
LuaValue a = LuaValue.NewNumber(42);LuaValue b = LuaValue.NewNumber(42);LuaValue c = LuaValue.NewString("42");// Value equalitybool equal = a.Equals(b); // truebool notEqual = a.Equals(c); // false (different types)// Can be used in dictionariesvar dict = new Dictionary<LuaValue, string>();dict[a] = "forty-two";Console.WriteLine(dict[b]); // "forty-two"
// Goodif (value.Type == DataType.Number){ double num = value.Number;}// Risky - may return default value if wrong typedouble num = value.Number;
Use static instances for common values
// Efficient - reuses static instancesreturn LuaValue.Nil;return LuaValue.True;return LuaValue.False;// Less efficient - creates new instancesreturn LuaValue.NewNil();return LuaValue.NewBoolean(true);
Handle Tuples appropriately
LuaValue result = script.Call(function);// If expecting single value, convert to scalarLuaValue single = result.ToScalar();// If expecting multiple values, check for tupleif (result.Type == DataType.Tuple){ foreach (LuaValue val in result.Tuple) { // Process each value }}