Lua toString 异常用于布尔值

Lua toString exception for boolean value

本文关键字:布尔值 用于 异常 toString Lua      更新时间:2023-10-16

我写了一个简单的lua函数,它使用'C++'函数来执行。由于我创建"C++"函数的目的是在所有lua函数中使用相同的函数来更新"C++"变量。它适用于数字,但是当我尝试将其用于布尔值时,它在转换为字符串时给了我异常。

这是我的代码片段。

C++代码。

#include <lua.hpp>
/* the Lua interpreter */
lua_State *luaState;
std::map<lua_State *, CLuaTest *> luaFbtlookup;
void CLuaTest::CLuaTest() {
  // initialize Lua 
  luaState = luaL_newstate();
  lua_register(luaState, "get_value", get_value);  // func to get values
  lua_register(luaState, "set_value", set_value);  // func to set values
  // load Lua base libraries 
  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;  // do not return zero
     }
     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;  // do not return zero
         }
     }
     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("红灯",False)时,我收到警告消息打印。我是否需要将False作为字符串传递?

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,它将返回最后传递的参数作为其结果。