luabind使用指南 - 入门篇
使用经验
- 在Lua中调用C++函数时必须写上所有参数,包括缺省参数;
- 在使用有 const char* 参数的注册函数中判断该参数是否为 NULL 的同时还要判断是否是空串,即"",并且在Lua中调用该函数时为 NULL 的参数改用空串""代替;
- 不要在Lua中传递nil或0给字符串参数,在给Lua注册使用的函数接口中字符串参数尽可能的用std::string代替;
- 有C++注册类对象的指针作为参数的注册函数,在Lua中调用时允许从nil转换到C++中的NULL;
在C++中调用Lua函数
1 int main () {
2 // 建立新的Lua环境
3 lua_State *L = luaL_newstate();
4
5 // 让LuaBind“认识”这个Lua环境
6 luabind::open(L);
7
8 // 定义一个叫add的Lua函数
9 luaL_dostring(L,
10 "function add(first, second)\n"
11 " return first + second\n"
12 "end\n"
13 );
14
15 // 调用add函数
16 try {
17 std::cout << "Result: "
18 << luabind::call_function<int>(L, "add", 2, 3)
19 << std::endl;
20
21 } catch (luabind::error& e) {
22 std::cout << "Catch Exception: " << e.what() << std::endl;
23 }
24
25 lua_close(L);
26
27 return 0;
28 }
2 // 建立新的Lua环境
3 lua_State *L = luaL_newstate();
4
5 // 让LuaBind“认识”这个Lua环境
6 luabind::open(L);
7
8 // 定义一个叫add的Lua函数
9 luaL_dostring(L,
10 "function add(first, second)\n"
11 " return first + second\n"
12 "end\n"
13 );
14
15 // 调用add函数
16 try {
17 std::cout << "Result: "
18 << luabind::call_function<int>(L, "add", 2, 3)
19 << std::endl;
20
21 } catch (luabind::error& e) {
22 std::cout << "Catch Exception: " << e.what() << std::endl;
23 }
24
25 lua_close(L);
26
27 return 0;
28 }
在Lua代码中调用C++函数
1 void print_hello(int number) {
2 std::cout << "hello world " << number << std::endl;
3 }
4
5 int main () {
6 // 建立新的Lua环境
7 lua_State *L = luaL_newstate();
8
9 // 让LuaBind“认识”这个Lua环境
10 luabind::open(L);
11
12 // 添加print_hello函数到Lua环境中
13 luabind::module(L) [
14 luabind::def("print_hello", print_hello)
15 ];
16
17 // 现在Lua中可以调用print_hello了
18 luaL_dostring(L, "print_hello(123)");
19
20 lua_close(L);
21
22 return 0;
23 }
2 std::cout << "hello world " << number << std::endl;
3 }
4
5 int main () {
6 // 建立新的Lua环境
7 lua_State *L = luaL_newstate();
8
9 // 让LuaBind“认识”这个Lua环境
10 luabind::open(L);
11
12 // 添加print_hello函数到Lua环境中
13 luabind::module(L) [
14 luabind::def("print_hello", print_hello)
15 ];
16
17 // 现在Lua中可以调用print_hello了
18 luaL_dostring(L, "print_hello(123)");
19
20 lua_close(L);
21
22 return 0;
23 }
在Lua代码中使用C++类
1 class NumberPrinter {
2 public:
3 NumberPrinter(int number) : m_number(number) {}
4
5 void print() {
6 std::cout << m_number << std::endl;
7 }
8
9 private:
10 int m_number;
11 };
12
13
14 int main () {
15 // 建立新的Lua环境
16 lua_State *L = luaL_newstate();
17
18 // 让LuaBind“认识”这个Lua环境
19 luabind::open(L);
20
21 // 使用LuaBind导出NumberPrinter类
22 luabind::module(L) [
23 luabind::class_<NumberPrinter>("NumberPrinter")
24 .def(luabind::constructor<int>())
25 .def("print", &NumberPrinter::print)
26 ];
27
28 // 现在Lua中可以使用NumberPinter类了
29 luaL_dostring(L,
30 "Print2000 = NumberPrinter(2000) "
31 "Print2000:print() "
32 );
33
34 lua_close(L);
35
36 return 0;
37 }
2 public:
3 NumberPrinter(int number) : m_number(number) {}
4
5 void print() {
6 std::cout << m_number << std::endl;
7 }
8
9 private:
10 int m_number;
11 };
12
13
14 int main () {
15 // 建立新的Lua环境
16 lua_State *L = luaL_newstate();
17
18 // 让LuaBind“认识”这个Lua环境
19 luabind::open(L);
20
21 // 使用LuaBind导出NumberPrinter类
22 luabind::module(L) [
23 luabind::class_<NumberPrinter>("NumberPrinter")
24 .def(luabind::constructor<int>())
25 .def("print", &NumberPrinter::print)
26 ];
27
28 // 现在Lua中可以使用NumberPinter类了
29 luaL_dostring(L,
30 "Print2000 = NumberPrinter(2000) "
31 "Print2000:print() "
32 );
33
34 lua_close(L);
35
36 return 0;
37 }
参考资料