ScriptX和Lua语言类型对照表
Lua | ScriptX |
---|---|
nil | Null |
table | Object |
table | Array |
string | String |
number | Number |
boolean | Boolean |
function | Function |
Lua语言使用1作为基数,但是C++语言是用0作为基数。因此在ScriptX中,对于数据等的操作,仍然使用0-based逻辑。
比如:
Local<Array> arr;
arr.set(0, "hello");
// lua
arr[1] == "hello";
Lua函数支持多返回值,但是ScriptX的API只支持返回 Local<Value>
。
当Lua函数返回多个值的时候,ScriptX会把返回值用Array包起来。
Lua语言没有ByteBuffer相关的API,因此ScriptX通过 binding API提供了一套实现。
同时在LuaEngine的构造函数里,使用者也可以传入自己的delegate实现ByteBuffer相关API
Lua语言没有内建的 instanceof
操作符,为了实现相应能力,ScriptX会在Lua全局增加一个ScriptX
工具类。
ScriptX.isInstanceOf(instance, Class)
// C++
class InstanceOfTest : public script::ScriptClass {
public:
using ScriptClass::ScriptClass;
};
auto instanceOfTestDefine =
defineClass<InstanceOfTest>("InstanceOfTest")
.constructor()
.build();
# lua
local ins = InstanceOfTest();
ScriptX.isInstanceOf(ins, InstanceOfTest) == true;
由于Lua没有标准的OO,对于一个ClassDefine,ScriptX会在lua中定义如下声明:
Class = {}
local staticMeta = {
// constructor call
__call = function()
local ins = {};
setmetatable(inx, instanceMeta);
return ins
end
}
for staticFunc do
Class[staticFunc.name] = function() ... end
end
setmetatable(Class, staticMeta)
local instanceMeta = {
__index = function()
1. find from `ClassDefine.instanceProperty`
2. find from `ClassDefine.instanceFunction`
3. return nil
end
__newindex = function()
1. find from `ClassDefine.instanceProperty`
2. raw set to table
__gc = function()
1. delete this
end
instanceFunction = {...}
}
ScriptX.getInstanceMeta(Class) == instanceMeta;
比如,要扩展一个绑定的类,可以如下:
local meta = ScriptX.getInstanceMeta(Class)
function meta:__add() print(self, "add") end
function meta.instanceFunction:hello()
print(self, "hello")
end
// test
local ext = Class()
x = ext + ext
ext:hello();
// output
table: 0x7fc873c18ed0 add
table: 0x7fc873c18ed0 hello