Using Lua API and tag method facilities, tolua maps C/C++ constants, external variables, functions, classes, and methods to Lua.How tolua works(1)創(chuàng)建a package file (a C/C++ cleaned header file) listing the constants, variables, functions, classes, and methods we want to export to the Lua environment.(2)parses this file and creates a C/C++ file that automatically binds the C/C++ code to Lua. (3) accesed from LuaHow to use toLua由(1)an executable (2)and a library組成the executable represents the parser that reads a package file and output a C/C++ code that implements the binding to access the C/C++ features from Lua.tolua -o myfile.c myfile.pkgtolua -H lua_XXX.h -o lua_XXX.cpp -n pkgXXX XXX.pkgtolua -n pkgname -o myfile.c myfile.pkgwhen using C++, we can opt for automatic initializationtolua -a -n pkgname -o myfile.c myfile.pkgautomatic initialization sometimes does not work也可以調(diào)用tolua_pkgname_close(void);解綁可以使用-H選項(xiàng)將open與close操作導(dǎo)出到頭文件中漆际。void tolua_restorestate (void);Basic Conceptspackage file may include other package file, use $Basic types
char int float double ? ? -> ? ? ? number
char* ? ? ? -> ? ? ? ? ? ? ?string
void* ? ? ? -> ? ? ? ? ? ? ?userdata
tolua ignores const modifier
Functions in C/C++ can also manipulate Lua objects explicitly.
lua_Object也是一種基本類型盗胀。
User defined types
非Basic Types均為用戶自定義類型整份,are mapped to tagged userdata type in Lua.
Lua can only store pointers to 自定義類型唬渗。
NULL and nil
Typedefs
必須使用之前聲明
typedef double real;
Including real header files
$#include "header1.h"
可以使用C/C++支持的注釋方式進(jìn)行注釋。
Binding constants
(1) define's
#define NAME [VALUE]
(2) enum's
enum {
NAME1[=VALUE1],
NAME2[=VALUE2]
};
Binding external variables
[extern] type var;
double v[10];//Lua中下標(biāo)從1開始
Binding functions
無(wú)參數(shù)時(shí)加void
Arrays
change to table
void func (int n, int m, double image[n*m]);
Overloaded functions
接受
但是只會(huì)根據(jù)參數(shù)轉(zhuǎn)換后的Lua類型進(jìn)行判斷
Default parameters values
void func(lua_Object lo = TOLUA_NIL)
void func(int a[5] = 0);
Multiple returned values
tolua uses feature of?Multiple returned values to simulate values passed by references
void swap (double* x, double* y);
or
void swap (double& x, double& y);
x, y = swap (x, y)
Binding struct fields
typdef struct [name] {
int x[10];
int y[10];
} Example;
Binding classes and methods
Specifying inheritance
class classname: public basename
{
/* class definition*/
};
Specifying exported memebers and methods
Constructors are called as static methods, named new,
Destructors are called as a conventional method called delete
virtual keyword has no effect in the package file
example:
class Point {
static int n;
double x;
double y;
static char* className(void);
Point (void);
Point (double px, double py);
~Point(void);
Point add (Point& other);
};
overloaded operators
operator+ - * / < > <= >=
operator[]
example:
double operator[](int index);
Module definition
module name
{
#define N
extern int var;
int func (...);
}
Renaming constants, variables and functions
#define CNAME @ ivar;
void cfunc @ ifunc (...);
class cannot be renamed, because they represent types in C.
Storing additional fields
based on table
Exported utility functions
tolua uses itself to export some utility functions to Lua, including its object-oriented framework.
tolua.using(table)
receives a table and maps all its fields to the global environment. thus we can map an entire module and access its features without the module prefix.
tolua.type(var)
returns a string representing the object type
tolua.tag("type")
returns type corresponding tag number
tolua.foreach(object)
this function filters all fields starting with a dot, not passing them to the provided callback function.
tolua.cast(object, "typename")
Returns the object "casted" to the given type. The object must represent an user type, otherwise return nil.
tolua.takeownership(object)
asks tolua to take the ownership of the given object.
This means the C/C++ object will be freed/destructed when garbage-collected by Lua. The object must represent an user type, otherwise an執(zhí)行錯(cuò)誤產(chǎn)生准浴。
tolua.class(table, base = nil)
the created class can inherit from a base class, previously created.
tolua.instance(table, class)
Sets the given table to be an instance of the given class.
example:
--define a Point class
classPoint = {x=0, y=0}
tolua.class(classPoint)--set as a class
--define print function
function classPoint:print()
print (self.x, self.y)
end
-- define add method
function classPoint:add(p2)
return Point{x=self.x+p2.x, y=self.y+p2.y}
end
-- define a Point constructor
function Point (p)
tolua.instance(p, classPoint) -- set as an instance of classPoint
return p
end
-- define a Color Point class
classColorPoint = {color = 'black' }
tolua.class(classColorPoint, classPoint) -- set as class inheriting from classPoint
-- define class methods
function classColorPoint:print()
print(self.x, self.y, self.color)
end
-- define Color Point constructor
function ColorPoint(p)
tolua.instance(p, classColorPoint) -- set as an instance of classColorPoint
return p
end
-- some valid codes would then be
p = Point{ x= 1}
q = ColorPoint{x=2, y =3, color =2)
r = p:add(q)
r:print()
Embedded Lua code
tolua allows us to embed Lua code in the C/C++ generated code.
$[
embedded Lua code
...
$]