{"id":4143,"date":"2020-03-02T16:02:26","date_gmt":"2020-03-02T08:02:26","guid":{"rendered":"https:\/\/damogame.cn\/wordpress\/?p=4143"},"modified":"2020-03-02T16:05:33","modified_gmt":"2020-03-02T08:05:33","slug":"lua-5-3-sol2-0-%e7%94%a8%e6%88%b7%e6%8c%87%e5%8d%97","status":"publish","type":"post","link":"https:\/\/i007.cc\/wordpress\/archives\/4143","title":{"rendered":"Lua 5.3 &#8212; SOL2.0 \u7528\u6237\u6307\u5357"},"content":{"rendered":"<p><a href=\"https:\/\/www.cnblogs.com\/oldtom\/p\/10165900.html\">\u539f\u6587\u5730\u5740<\/a><\/p>\n<p>&nbsp;<\/p>\n<p>SOL2.2 \u662f\u4e00\u4e2a\u5feb\u901f\u3001\u7b80\u5355\u7684C++\u4e0eLUA\u7684\u7ed1\u5b9a\u5668\u3002\u5982\u679c\u786e\u5b9a\u8981\u5728\u4f60\u7684\u7a0b\u5e8f\u91cc\u9762\u540c\u65f6\u8fd0\u884cLua\u548cC++\uff0cSOL \u662f\u4e00\u4e2a\u9ad8\u6027\u80fd\u7684\u7ed1\u5b9a\u5668\uff0c\u662f\u4e00\u4e2aAPI\u4f7f\u7528\u65b9\u4fbf\u7684 GO-TO \u6846\u67b6\u3002<\/p>\n<p>&nbsp;<\/p>\n<p>\u7b80\u5355\u770b\u4e00\u4e0b\u7279\u70b9\uff1a\u8fd9\u4e2a\u94fe\u63a5\u5230\uff08\u672a\u94fe\u63a5\uff09\u5927\u90e8\u5206API\u3002\u60a8\u4e5f\u53ef\u4ee5\u76f4\u63a5\u6d4f\u89c8API\u6216\u9605\u8bfb\u6559\u7a0b\u3002\u8981\u4e86\u89e3\u6709\u5173usertypes\u7684\u5b9e\u73b0\u7684\u8be6\u7ec6\u4fe1\u606f\uff0c\u8bf7\u53c2\u9605\u6b64\u5904\u8981\u4e86\u89e3\u5982\u4f55\u5904\u7406\u51fd\u6570\u53c2\u6570\uff0c\u8bf7\u53c2\u9605\u6b64\u6ce8\u91ca\u3002\u770b\u4e0d\u5230\u4f60\u60f3\u8981\u7684\u529f\u80fd\uff1f\u5411\u95ee\u9898\u8ddf\u8e2a\u5668\u53d1\u9001\u6709\u5173\u7279\u5b9a\u62bd\u8c61\u652f\u6301\u7684\u8bf7\u6c42\u3002<\/p>\n<p>&nbsp;<\/p>\n<p>\u4e0b\u9762\u7684\u4ee3\u7801<em>\u548c<\/em>\u66f4\u591a\u793a\u4f8b\u53ef\u4ee5\u5728<a class=\"reference external\" href=\"https:\/\/github.com\/ThePhD\/sol2\/tree\/develop\/examples\">examples\u76ee\u5f55\u4e2d<\/a>\u627e\u5230<\/p>\n<p>&nbsp;<\/p>\n<pre><span class=\"cp\">#define SOL_CHECK_ARGUMENTS 1\r\n\r\n#include <span class=\"cpf\">&lt;sol.hpp&gt;\r\n#include \"..\/assert.hpp\"\r\n\r\n<span class=\"kt\">int <span class=\"nf\">main<span class=\"p\">() {\r\n\t<span class=\"n\">sol<span class=\"o\">::state lua;\r\n\tint x = <span class=\"mi\">0;\r\n\tlua.set_function(<span class=\"s\">\"beep\", [&amp;x]{ ++x; });\r\n\tlua.script(\"beep()\");\r\n\tc_assert(x == 1);\r\n\r\n\tsol::function beep = lua[\"beep\"];\r\n\tbeep();\r\n\tc_assert(x == 2);\r\n\r\n\t<span class=\"k\">return 0;\r\n}<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span>\r\n\r\n<\/pre>\n<pre><span class=\"cp\">#define SOL_CHECK_ARGUMENTS 1\r\n\r\n#include <span class=\"cpf\">&lt;sol.hpp&gt;\r\n#include \"..\/assert.hpp\"\r\n\r\n<span class=\"k\">struct <span class=\"n\">vars <span class=\"p\">{\r\n\t<span class=\"kt\">int boop <span class=\"o\">= <span class=\"mi\">0;\r\n\r\n\tint <span class=\"nf\">bop () const {\r\n\t\treturn boop + 1;\r\n\t}\r\n};\r\n\r\nint main() {\r\n\tsol::state lua;\r\n\tlua.new_usertype&lt;vars&gt;(<span class=\"s\">\"vars\", \r\n\t\t\"boop\", &amp;vars::boop,\r\n\t\t\"bop\", &amp;vars::bop);\r\n\tlua.script(\"beep = vars.new()<span class=\"se\">\\n\"\r\n\t\t\"beep.boop = 1\\n\"\r\n\t\t\"bopvalue = beep:bop()\");\r\n\r\n\tvars&amp; beep = lua[\"beep\"];\r\n\tint bopvalue = lua[\"bopvalue\"];\r\n\r\n\tc_assert(beep.boop == 1);\r\n\tc_assert(lua.get&lt;vars&gt;(\"beep\").boop == 1);\r\n\tc_assert(beep.bop() == 2);\r\n\tc_assert(bopvalue == 2);\r\n\r\n\treturn 0;\r\n}\r\n\r\n<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/pre>\n<p class=\"first admonition-title\">\u6ce8\u610f<\/p>\n<p class=\"last\">\u5728\u4f60\u5b66\u4e60\u4e86sol\u7684\u57fa\u7840\u77e5\u8bc6\u4e4b\u540e\uff0c\u5efa\u8bae\u4f60\u5982\u679c\u8ba4\u4e3a\u67d0\u4e9b\u4e1c\u897f\u53ef\u4ee5\u8fd0\u884c\uff0c\u4f60\u5e94\u8be5\u5c1d\u8bd5\u4e00\u4e0b\u3002\u5b83\u53ef\u80fd\u4f1a\u8fd0\u884c\uff01<\/p>\n<p class=\"last\">\u4ee5\u4e0b\u6240\u6709\u4ee3\u7801\u5747\u53ef\u5728<a class=\"reference external\" href=\"https:\/\/github.com\/ThePhD\/sol2\/tree\/develop\/examples\/tutorials\/quick_n_dirty\">sol2\u6559\u7a0b\u793a\u4f8b\u4e2d\u627e\u5230<\/a>\u3002<\/p>\n<h2>\u65ad\u8a00\/\u5148\u51b3\u6761\u4ef6<\/h2>\n<p>The implementation for\u00a0<code class=\"docutils literal notranslate\">assert.hpp<\/code>\u00a0with\u00a0<code class=\"docutils literal notranslate\">c_assert<\/code>\u00a0looks like so:<\/p>\n<p>\u4f60\u9700\u8981\u4ee3\u7801\u4e2d<code class=\"docutils literal notranslate\"><span class=\"pre\">#include&lt;sol.hpp&gt;<\/span><\/code><code class=\"docutils literal notranslate\"><span class=\"pre\">#include\u00a0\"sol.hpp\"<\/span><\/code>\u3002SOL\u53ea\u6709\u5934\u6587\u4ef6\uff0c\u6240\u4ee5\u4f60\u4e0d\u9700\u8981\u7f16\u8bd1\u4efb\u4f55\u4e1c\u897f\u3002\u4f46\u662f\uff0c<strong>Lua\u5fc5\u987b\u7f16\u8bd1\u5e76\u53ef\u7528<\/strong>\u3002\u6709\u5173\u66f4\u591a\u8be6\u7ec6\u4fe1\u606f\uff0c\u8bf7\u53c2\u9605<a class=\"reference internal\" href=\"https:\/\/sol2.readthedocs.io\/en\/latest\/tutorial\/getting-started.html\"><span class=\"doc\">\u5165\u95e8\u6559\u7a0b<\/span><\/a>\u3002<\/p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">assert.hpp\u00a0\u548c\u00a0<\/span><\/code><code class=\"docutils literal notranslate\">c_assert \u7684\u5b9e\u73b0<\/code>\u770b\u8d77\u6765\u50cf\u8fd9\u6837\uff1a<\/p>\n<pre><span class=\"cp\">#ifndef EXAMPLES_ASSERT_HPP\r\n#define EXAMPLES_ASSERT_HPP\r\n\r\n#   define m_assert(condition, message) \\\r\n    do { \\\r\n        if (! (condition)) { \\\r\n            std::cerr &lt;&lt; \"Assertion `\" #condition \"` failed in \" &lt;&lt; __FILE__ \\\r\n                      &lt;&lt; \" line \" &lt;&lt; __LINE__ &lt;&lt; \": \" &lt;&lt; message &lt;&lt; std::endl; \\\r\n            std::terminate(); \\\r\n        } \\\r\n    } while (false)\r\n\r\n#   define c_assert(condition) \\\r\n    do { \\\r\n        if (! (condition)) { \\\r\n            std::cerr &lt;&lt; \"Assertion `\" #condition \"` failed in \" &lt;&lt; __FILE__ \\\r\n                      &lt;&lt; \" line \" &lt;&lt; __LINE__ &lt;&lt; std::endl; \\\r\n            std::terminate(); \\\r\n        } \\\r\n    } while (false)\r\n#else\r\n#   define m_assert(condition, message) do { if (false) { (void)(condition); (void)sizeof(message); } } while (false)\r\n#   define c_assert(condition) do { if (false) { (void)(condition); } } while (false)\r\n#endif\r\n\r\n#endif <span class=\"c1\">\/\/ EXAMPLES_ASSERT_HPP\r\n\r\n\r\n\u8fd9\u662f\u4e0b\u9762\u793a\u4f8b\u4ee3\u7801\u4e2d\u4f7f\u7528\u7684\u65ad\u8a00\u3002 <\/span><\/span><\/pre>\n<div id=\"opening-a-state\" class=\"section\">\n<h2>\u00a0 \u00a0\u6253\u5f00\u72b6\u6001<\/h2>\n<pre><span class=\"cp\">#define SOL_CHECK_ARGUMENTS 1\r\n#include <span class=\"cpf\">&lt;sol.hpp&gt;\r\n\r\n#include &lt;iostream&gt;\r\n#include \"..\/..\/assert.hpp\"\r\n\r\n<span class=\"kt\">int <span class=\"nf\">main<span class=\"p\">(int, char<span class=\"o\">*[]) {\r\n\t<span class=\"n\">std::cout &lt;&lt; <span class=\"s\">\"=== opening a state ===\" &lt;&lt; std::endl;\r\n\r\n\tsol::state lua;\r\n\t<span class=\"c1\">\/\/ open some common libraries\r\n\tlua.open_libraries(sol::lib::base, sol::lib::package);\r\n\tlua.script(\"print('bark bark bark!')\");\r\n\r\n\tstd::cout &lt;&lt; std::endl;\r\n\r\n\t<span class=\"k\">return <span class=\"mi\">0;\r\n}\r\n\r\n\r\n<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/pre>\n<h2>\u5728lua_State\u4e0a\u4f7f\u7528sol2 *<\/h2>\n<p>\u5bf9\u4e8e\u5df2\u7ecf\u4f7f\u7528Lua\u6216\u4f7f\u7528\u5176\u4ed6\u7684Lua\u7cfb\u7edf\uff08LuaBridge\uff0ckaguya\uff0cLuwra\u7b49\uff09\u7684\u7cfb\u7edf\/\u6e38\u620f\uff0c\u4f60\u4ecd\u7136\u4f1a\u559c\u6b22sol2\u7684\uff1a<\/p>\n<pre><span class=\"cp\">#define SOL_CHECK_ARGUMENTS 1\r\n#include <span class=\"cpf\">&lt;sol.hpp&gt;\r\n\r\n#include &lt;iostream&gt;\r\n\r\n<span class=\"kt\">int <span class=\"nf\">use_sol2<span class=\"p\">(<span class=\"n\">lua_State<span class=\"o\">* L) {\r\n\tsol::state_view lua(L);\r\n\tlua.script(<span class=\"s\">\"print('bark bark bark!')\");\r\n\t<span class=\"k\">return <span class=\"mi\">0;\r\n}\r\n\r\nint main(int, char*[]) {\r\n\tstd::cout &lt;&lt; \"=== opening sol::state_view on raw Lua ===\" &lt;&lt; std::endl;\r\n\r\n\tlua_State* L = luaL_newstate();\r\n\tluaL_openlibs(L);\r\n\r\n\tlua_pushcclosure(L, &amp;use_sol2, 0);\r\n\tlua_setglobal(L, \"use_sol2\");\r\n\r\n\tif (luaL_dostring(L, \"use_sol2()\")) {\r\n\t\tlua_error(L);\r\n\t\treturn -1;\r\n\t}\r\n\r\n\tstd::cout &lt;&lt; std::endl;\r\n\r\n\treturn 0;\r\n}\r\n\r\n<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/pre>\n<h2>\u8fd0\u884clua\u4ee3\u7801<\/h2>\n<pre><span class=\"cp\">#define SOL_CHECK_ARGUMENTS 1\r\n#include <span class=\"cpf\">&lt;sol.hpp&gt;\r\n\r\n#include &lt;fstream&gt;\r\n#include &lt;iostream&gt;\r\n#include \"..\/..\/assert.hpp\"\r\n\r\n<span class=\"kt\">int <span class=\"nf\">main<span class=\"p\">(int, char<span class=\"o\">*[]) {\r\n\t<span class=\"n\">std::cout &lt;&lt; <span class=\"s\">\"=== running lua code ===\" &lt;&lt; std::endl;\r\n\r\n\tsol::state lua;\r\n\tlua.open_libraries(sol::lib::base);\r\n\t\r\n\t<span class=\"c1\">\/\/ load and execute from string\r\n\tlua.script(\"a = 'test'\");\r\n\t\/\/ load and execute from file\r\n\tlua.script_file(\"a_lua_script.lua\");\r\n\r\n\t\/\/ run a script, get the result\r\n\tint value = lua.script(\"return 54\");\r\n\tc_assert(value == <span class=\"mi\">54);\r\n\r\n\r\n\/\/\u8981\u8fd0\u884cLua\u4ee3\u7801\u4f46\u9700\u6709\u9519\u8bef\u5904\u7406\u7a0b\u5e8f\u4ee5\u9632\u51fa\u73b0\u95ee\u9898\uff1a\r\n\r\n<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/pre>\n<pre><span class=\"k\">      auto <span class=\"n\">bad_code_result <span class=\"o\">= lua<span class=\"p\">.script(<span class=\"s\">\"123 herp.derp\", [](lua_State*, sol::protected_function_result pfr) {\r\n\t\t<span class=\"c1\">\/\/ pfr will contain things that went wrong, for either loading or executing the script\r\n\t\t\/\/ Can throw your own custom error\r\n\t\t\/\/ You can also just return it, and let the call-site handle the error if necessary.\r\n\t\treturn pfr;\r\n\t});\r\n\t\/\/ it did not work\r\n\tc_assert(!bad_code_result.valid());\r\n\t\r\n\t\/\/ the default handler panics or throws, depending on your settings\r\n\t\/\/ uncomment for explosions:\r\n\t\/\/auto bad_code_result_2 = lua.script(\"bad.code\", &amp;sol::script_default_on_error);\r\n\treturn <span class=\"mi\">0;\r\n}<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/pre>\n<h2>\u8fd0\u884clua\u4ee3\u7801\uff08\u5e95\u5c42\uff09<\/h2>\n<p>\u60a8\u53ef\u4ee5\u4f7f\u7528\u5355\u72ec\u7684\u52a0\u8f7d\u548c\u51fd\u6570\u8c03\u7528\u64cd\u4f5c\u7b26\u6765\u52a0\u8f7d\uff0c\u68c0\u67e5\uff0c\u7136\u540e\u8fd0\u884c\u548c\u68c0\u67e5\u4ee3\u7801\u3002<\/p>\n<p class=\"first admonition-title\">\u8b66\u544a<\/p>\n<p class=\"last\">\u8fd9\u53ea\u662f\u5728\u4f60\u9700\u8981\u67d0\u79cd\u7ec6\u7c92\u5ea6\u63a7\u5236\u7684\u60c5\u51b5\u4e0b\uff1a\u5bf9\u4e8e99\uff05\u7684\u60c5\u51b5\uff0c<a class=\"reference internal\" href=\"https:\/\/sol2.readthedocs.io\/en\/latest\/tutorial\/all-the-things.html#running-lua-code\">\u8fd0\u884clua\u4ee3\u7801<\/a>\u662f\u9996\u9009\uff0c\u5e76\u907f\u514d\u5728\u4e0d\u7406\u89e3\u811a\u672c\/\u52a0\u8f7d\u4e0e\u9700\u8981\u5728\u52a0\u8f7d\u540e\u8fd0\u884c\u5757\u4e4b\u95f4\u7684\u5dee\u5f02\u65f6\u7684\u7f3a\u9677\u3002<\/p>\n<pre><span class=\"cp\">#define SOL_CHECK_ARGUMENTS 1\r\n#include <span class=\"cpf\">&lt;sol.hpp&gt;\r\n\r\n#include &lt;fstream&gt;\r\n#include &lt;iostream&gt;\r\n#include &lt;cstdio&gt;\r\n#include \"..\/..\/assert.hpp\"\r\n\r\n<span class=\"kt\">int <span class=\"nf\">main<span class=\"p\">(int, char<span class=\"o\">*[]) {\r\n\t<span class=\"n\">std::cout &lt;&lt; <span class=\"s\">\"=== running lua code (low level) ===\" &lt;&lt; std::endl;\r\n\r\n\tsol::state lua;\r\n\tlua.open_libraries(sol::lib::base);\r\n\r\n\t<span class=\"c1\">\/\/ load file without execute\r\n\tsol::load_result script1 = lua.load_file(\"a_lua_script.lua\");\r\n\t\/\/execute\r\n\tscript1();\r\n\r\n\t\/\/ load string without execute\r\n\tsol::load_result script2 = lua.load(\"a = 'test'\");\r\n\t\/\/execute\r\n\tsol::protected_function_result script2result = script2();\r\n\t\/\/ optionally, check if it worked\r\n\t<span class=\"k\">if (script2result.valid()) {\r\n\t\t\/\/ yay!\r\n\t}\r\n\telse {\r\n\t\t\/\/ aww\r\n\t}\r\n\r\n\tsol::load_result script3 = lua.load(\"return 24\");\r\n\t\/\/ execute, get return value\r\n\tint value2 = script3();\r\n\tc_assert(value2 == <span class=\"mi\">24);\r\n\r\n\treturn 0;\r\n}<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/pre>\n<\/div>\n<pre><span class=\"cp\"><span class=\"cpf\"><span class=\"k\"><span class=\"n\"><span class=\"p\"><span class=\"kt\"><span class=\"o\"><span class=\"mi\"><span class=\"nf\"><span class=\"s\"><span class=\"se\">\u00a0<\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/span><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u539f\u6587\u5730\u5740 &nbsp; SOL2.2 \u662f<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"colormag_page_container_layout":"default_layout","colormag_page_sidebar_layout":"default_layout","footnotes":""},"categories":[],"tags":[118],"class_list":["post-4143","post","type-post","status-publish","format-standard","hentry","tag-02-"],"_links":{"self":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts\/4143","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/comments?post=4143"}],"version-history":[{"count":0,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts\/4143\/revisions"}],"wp:attachment":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/media?parent=4143"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/categories?post=4143"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/tags?post=4143"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}