Lua处理Boolean值的ToString异常

我写了一个简单的lua函数,它使用'C++'函数执行操作。我的创建'C++'函数的意图是在所有lua函数中使用相同的函数以更新'C++'变量。对于数字,它运行很好,但当我尝试将其应用于Boolean值时,在转换为字符串时会出现异常。

以下是我的代码片段。

C++代码。

#include <lua.hpp>
/* Lua解释器 */
lua_State *luaState;
std::map<lua_State *, CLuaTest *> luaFbtlookup;

void CLuaTest::CLuaTest() {
  // 初始化Lua
  luaState = luaL_newstate();
  lua_register(luaState, "get_value", get_value);  // 获取值的函数
  lua_register(luaState, "set_value", set_value);  // 设置值的函数
  // 加载Lua基础库
  luaL_openlibs(luaState);
  luaL_dofile(luaState, "C:\LuaTest.lua");
  luaFbtlookup.insert(make_pair(luaState, this));
}

 int get_value(lua_State *L);
 int set_value(lua_State *L);

 extern "C++" int get_value(lua_State *L)
 {
     string lightName = lua_tostring(L, 1);
     FbTLuaLookup::iterator iter = luaFbtlookup.find(L);
     if (iter != luaFbtlookup.end()) {
         lua_pushstring(L, iter->second->getValueFrom(lightName).c_str());
         return 1;  // 不要返回零
     }
     return 1;
 }

 extern "C++" int set_value(lua_State *L)
 {
     string lightName = lua_tostring(L, 1);
     if (NULL == lua_tostring(L, 2))
     {
         printf("WARNING : Invalid String Argument / Cannot convert arg#2 to string");
     }
     else {
         string value = lua_tostring(L, 2);

         FbTLuaLookup::iterator iter = luaFbtlookup.find(L);
         if (iter != luaFbtlookup.end()) {
             iter->second->setValueTo(lightName, value);
             lua_pushnumber(L, true);
             return 1;  // 不要返回零
         }
     }
     return 1;
 }

CLuaTest::ExecuteScript(enum Seq) {
  switch(Seq) {
    case 0:
      lua_getglobal(luaState, "AllLightsOff");
    break;

    case 1:
      lua_getglobal(luaState, "RedLightOn");
    break;

    case 2:
      lua_getglobal(luaState, "AmberLightOn");
    break;

    case 3:
     lua_getglobal(luaState, "GreenLightOn");
    break;
  }
}

我的lua脚本:

function AllLightsOff
  set_value("RedLight", 0)
  set_value("AmberLight",0)
  set_value("GrenLight",0)
end

function RedLightOn
  set_value("RedLight", 1)
  set_value("AmberLight",0)
  set_value("GrenLight",0)
end

function AmberLightOn
  set_value("RedLight", 0)
  set_value("AmberLight",1)
  set_value("GrenLight",0)
end

function GreenLightOn
  set_value("RedLight", 0)
  set_value("AmberLight",0)
  set_value("GrenLight",1)
end

使用上面的代码一切正常,但是当我尝试将set value更改为使用Boolean值时,比如**set_value("RedLight", False)**,我会得到一个警告信息。我需要将False作为字符串传递吗?

点赞
用户88888888
用户88888888

Lua 没有 False 关键字,因此它简单地尝试读取全局变量 _G["False"],它当然是 nil

它有 false 关键字,但是它不起作用:lua_tostring 只适用于数字和字符串。

我们看不到 setValueTo 代码,因此很难猜测它的工作原理。

  • 如果你只想传递 bool 值给它,请使用 lua_toboolean,但请注意它会将 0 视为 true(与 Lua 一般的处理方式不同)。
  • 如果你想将 "True""False" 作为字符串传递,那么是的,你必须写 set_value("RedLight", "False")

顺便说一下,考虑阅读 如何实现 lua_CFunction 协议。现在,如果 get_value 找不到 lightName,它会将最后一个传递的参数作为返回值。

2016-04-25 20:32:20