系列教程指南【1】

注意

在你学习了sol的基础知识之后,建议你如果认为某些东西可以运行,你应该尝试一下。它可能会运行!

以下所有代码均可在sol2教程示例中找到。

断言/先决条件

The implementation for assert.hpp with c_assert looks like so:

你需要代码中#include<sol.hpp>#include "sol.hpp"。SOL只有头文件,所以你不需要编译任何东西。但是,Lua必须编译并可用。有关更多详细信息,请参阅入门教程。

assert.hpp 和 c_assert 的实现看起来像这样:

#ifndef EXAMPLES_ASSERT_HPP
#define EXAMPLES_ASSERT_HPP # define m_assert(condition, message) \
do { \
if (! (condition)) { \
std::cerr << "Assertion `" #condition "` failed in " << __FILE__ \
<< " line " << __LINE__ << ": " << message << std::endl; \
std::terminate(); \
} \
} while (false) # define c_assert(condition) \
do { \
if (! (condition)) { \
std::cerr << "Assertion `" #condition "` failed in " << __FILE__ \
<< " line " << __LINE__ << std::endl; \
std::terminate(); \
} \
} while (false)
#else
# define m_assert(condition, message) do { if (false) { (void)(condition); (void)sizeof(message); } } while (false)
# define c_assert(condition) do { if (false) { (void)(condition); } } while (false)
#endif #endif // EXAMPLES_ASSERT_HPP 这是下面示例代码中使用的断言。

打开状态

#define SOL_CHECK_ARGUMENTS 1
#include <sol.hpp> #include <iostream>
#include "../../assert.hpp" int main(int, char*[]) {
std::cout << "=== opening a state ===" << std::endl; sol::state lua;
// open some common libraries
lua.open_libraries(sol::lib::base, sol::lib::package);
lua.script("print('bark bark bark!')"); std::cout << std::endl; return 0;
}

在lua_State上使用sol2 *

对于已经使用Lua或使用其他的Lua系统(LuaBridge,kaguya,Luwra等)的系统/游戏,你仍然会喜欢sol2的:

#define SOL_CHECK_ARGUMENTS 1
#include <sol.hpp> #include <iostream> int use_sol2(lua_State* L) {
sol::state_view lua(L);
lua.script("print('bark bark bark!')");
return 0;
} int main(int, char*[]) {
std::cout << "=== opening sol::state_view on raw Lua ===" << std::endl; lua_State* L = luaL_newstate();
luaL_openlibs(L); lua_pushcclosure(L, &use_sol2, 0);
lua_setglobal(L, "use_sol2"); if (luaL_dostring(L, "use_sol2()")) {
lua_error(L);
return -1;
} std::cout << std::endl; return 0;
}

运行lua代码

#define SOL_CHECK_ARGUMENTS 1
#include <sol.hpp> #include <fstream>
#include <iostream>
#include "../../assert.hpp" int main(int, char*[]) {
std::cout << "=== running lua code ===" << std::endl; sol::state lua;
lua.open_libraries(sol::lib::base); // load and execute from string
lua.script("a = 'test'");
// load and execute from file
lua.script_file("a_lua_script.lua"); // run a script, get the result
int value = lua.script("return 54");
c_assert(value == 54); //要运行Lua代码但需有错误处理程序以防出现问题:
      auto bad_code_result = lua.script("123 herp.derp", [](lua_State*, sol::protected_function_result pfr) {
// pfr will contain things that went wrong, for either loading or executing the script
// Can throw your own custom error
// You can also just return it, and let the call-site handle the error if necessary.
return pfr;
});
// it did not work
c_assert(!bad_code_result.valid()); // the default handler panics or throws, depending on your settings
// uncomment for explosions:
//auto bad_code_result_2 = lua.script("bad.code", &sol::script_default_on_error);
return 0;
}

运行lua代码(底层)

您可以使用单独的加载和函数调用操作符来加载,检查,然后运行和检查代码。

警告

这只是在你需要某种细粒度控制的情况下:对于99%的情况,运行lua代码是首选,并避免在不理解脚本/加载与需要在加载后运行块之间的差异时的缺陷。

#define SOL_CHECK_ARGUMENTS 1
#include <sol.hpp> #include <fstream>
#include <iostream>
#include <cstdio>
#include "../../assert.hpp" int main(int, char*[]) {
std::cout << "=== running lua code (low level) ===" << std::endl; sol::state lua;
lua.open_libraries(sol::lib::base); // load file without execute
sol::load_result script1 = lua.load_file("a_lua_script.lua");
//execute
script1(); // load string without execute
sol::load_result script2 = lua.load("a = 'test'");
//execute
sol::protected_function_result script2result = script2();
// optionally, check if it worked
if (script2result.valid()) {
// yay!
}
else {
// aww
} sol::load_result script3 = lua.load("return 24");
// execute, get return value
int value2 = script3();
c_assert(value2 == 24); return 0;
}

QQ群号: 790763256

Lua 5.3 -- SOL2.0 用户指南 【2】的更多相关文章

  1. Lua 5.3 -- SOL2.0 用户指南 【1】

    SOL2.2 是一个快速.简单的C++与LUA的绑定器.如果确定要在你的程序里面同时运行Lua和C++,SOL 是一个高性能的绑定器,是一个API使用方便的 GO-TO 框架. 简单看一下特点:这个链 ...

  2. Gradle2.0用户指南翻译——第一章. 介绍

    翻译项目请关注Github上的地址:https://github.com/msdx/gradledoc本文翻译所在分支:https://github.com/msdx/gradledoc/tree/2 ...

  3. Gradle2.0用户指南翻译——第三章. 教程

    翻译项目请关注Github上的地址:https://github.com/msdx/gradledoc本文翻译所在分支:https://github.com/msdx/gradledoc/tree/2 ...

  4. Gradle2.0用户指南翻译——第二章. 概述

    翻译项目请关注Github上的地址:https://github.com/msdx/gradledoc本文翻译所在分支:https://github.com/msdx/gradledoc/tree/2 ...

  5. Netty4.0 用户指南

    原文链接http://netty.io/wiki/user-guide-for-4.x.html 前言 Nowadays we use general purpose applications or ...

  6. 【翻译】Flume 1.8.0 User Guide(用户指南) Processors

    翻译自官网flume1.8用户指南,原文地址:Flume 1.8.0 User Guide 篇幅限制,分为以下5篇: [翻译]Flume 1.8.0 User Guide(用户指南) [翻译]Flum ...

  7. 【翻译】Flume 1.8.0 User Guide(用户指南) Channel

    翻译自官网flume1.8用户指南,原文地址:Flume 1.8.0 User Guide 篇幅限制,分为以下5篇: [翻译]Flume 1.8.0 User Guide(用户指南) [翻译]Flum ...

  8. 【翻译】Flume 1.8.0 User Guide(用户指南) Sink

    翻译自官网flume1.8用户指南,原文地址:Flume 1.8.0 User Guide 篇幅限制,分为以下5篇: [翻译]Flume 1.8.0 User Guide(用户指南) [翻译]Flum ...

  9. 【翻译】Flume 1.8.0 User Guide(用户指南) source

    翻译自官网flume1.8用户指南,原文地址:Flume 1.8.0 User Guide 篇幅限制,分为以下5篇: [翻译]Flume 1.8.0 User Guide(用户指南) [翻译]Flum ...

随机推荐

  1. 分布式——吞吐量巨强、Hbase的承载者 LSMT

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是分布式系统的第九篇文章. 今天给大家分享的内容是LSM树,它的英文是Log-structed Merge-tree.看着有些发怵,但其 ...

  2. 广告行业中那些趣事系列7:实战腾讯开源的文本分类项目NeuralClassifier

    摘要:本篇主要分享腾讯开源的文本分类项目NeuralClassifier.虽然实际项目中使用BERT进行文本分类,但是在不同的场景下我们可能还需要使用其他的文本分类算法,比如TextCNN.RCNN等 ...

  3. Windows软件包管理工具 - Chocolatey

    概述 windows下的软件安装管理器(用于自动管理软件安装,更新,卸载) Chocolatey引入了真正的包管理概念,使您能够对事物进行版本控制,管理依赖关系和安装顺序,更好的库存管理以及其他功能 ...

  4. Flutter 实现不同样式(有样式) 的TextField (可自定义),类似微博#话题#、@用户,(给TextField加TextSpan)

    描述 先上效果图 在项目中,有 @ 和 话题功能,需要在编辑时即可回显,但是官方原生的TextField不支持对部分文字定义不同的样式,所以封装了一个. 注意:这不是富文本插件,不支持在输入框中显示图 ...

  5. 文本编辑器之kindeditor

    摘要:最近在自己学习搭建网站的时候,突然要搭建网站的时候发现了一个好东西,那就是kindeditor这个文本编辑器,这个编辑器简单好用,而且很小,并且是开源的. 文本编辑器介绍 KindEditor ...

  6. Codeforces Add on a Tree

    Add on a Tree time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  7. [LeetCode] 937. Reorder Data in Log Files 日志文件的重新排序

    You have an array of `logs`.  Each log is a space delimited string of words. For each log, the first ...

  8. linux pdftk

    部分内容来源网络,如有版权问题,请联系删除: http://xuqin.blog.51cto.com/5183168/1117780,   http://blog.sina.com.cn/s/blog ...

  9. Java并发编程锁之独占公平锁与非公平锁比较

    Java并发编程锁之独占公平锁与非公平锁比较 公平锁和非公平锁理解: 在上一篇文章中,我们知道了非公平锁.其实Java中还存在着公平锁呢.公平二字怎么理解呢?和我们现实理解是一样的.大家去排队本着先来 ...

  10. coding++:高并发解决方案限流技术---漏桶算法限流--demo

    1.漏桶算法 漏桶作为计量工具(The Leaky Bucket Algorithm as a Meter)时,可以用于流量整形(Traffic Shaping)和流量控制(TrafficPolici ...