Lua错误没有通过布尔值。
这个代码能够工作...
if ( tileType == "water" or
( otherObj and otherObj:GetType() == "IceBlock" )) then
self:SetNoClip( true )
else
self:SetNoClip( false )
end
但下面这些代码不能工作...
self:SetNoClip( tileType == "water" or
( otherObj and otherObj:GetType() == "IceBlock" ))
//----------------------------------------------------------
local noClip = ( tileType == "water" or
( otherObj and otherObj:GetType == "IceBlock" ))
self:SetNoClip( noClip )
otherObj
这个测试只是检查otherObj
是否为nil
。变量是在前一行中检索的。当应用程序运行时我得到的错误是:
unprotected error to call in Lua API(script path...: Did not pass boolean to SetNoClip).
SetNoClip是应用程序中的一个函数,它通过lua_toboolean
从Lua堆栈中取出推送的参数。
那么为什么第一个能工作而第二个和第三个却会返回错误?
编辑:
SetNoClip在之前定义为下面的代码。
int GameObject::LuaSetNoClip( lua_State *L ) {
if ( !lua_isboolean( L, -1 )) {
LogLuaErr( "Did not pass boolean to SetNoClip for GameObject: " + m_type );
return luaL_error( L, "Did not pass boolean to SetNoClip" );
}
m_noClip = lua_toboolean( L, -1 );
return 0;
}
问题在于,lua_isboolean
不进行任何隐式类型转换(但lua_toboolean
会),并且只会对字面上的布尔值返回true。因此,如果它看到nil
,它将返回没有传递布尔值。我只是删除了对字面布尔值的错误检查,因为人们(包括我在内)通常依靠不是布尔文字的参数正确地被视为布尔值。
原文链接 https://stackoverflow.com/questions/3223989
and
操作符会返回它的第一个参数,如果那个值被认为是非真,否则返回它的第二个参数。
or
操作符会返回它的第一个参数,如果它被认为是真,否则返回它的第二个参数。
因此,A or (B and C)
可以理论上返回以下任何一个值:
- 如果
A
是被认为是真的值,那么返回A
- 如果
B
是被认为是假的值,且A
被认为是假的值,那么返回B
- 如果不满足以上两个条件,那么返回
C
需要注意的是,A
、B
和 C
不一定是实际的布尔值——只要它们可以被解释为布尔值即可。由于 nil
被认为是假的值,所以可能会发生第二种情况,传递给 SetNoClip
的参数是 nil
而不是 true
或 false
。
解决这个问题的一种方法是显式地与 nil
进行比较,而不仅仅是使用对象:
( otherObj ~= nil and otherObj:GetType() == "IceBlock" )
因为 ~=
操作符保证返回一个布尔值。
正如你所见,Lua中任何对象都可以被解释为布尔值。因此,如果你仅仅期望传递一个布尔对象,那么你的LuaSetNoClip的实现“不符合Lua的精神与实践”。你应该直接使用lua_toboolean
。
我认为你可以合理地进行唯一的参数检查:luaL_checkany
:
int GameObject::LuaSetNoClip(lua_State * L){
luaL_checkany(L,1);
m_noClip = lua_toboolean(L,1);
return 0;
}
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
这取决于 SetNoClip 内部发生了什么(即这不一定会导致一般问题)。但是,我相信问题在于
and
和or
返回两侧的值而不是评估为true
或false
。换句话说,foo and bar
如果
foo
是nil
或false
,则将返回foo
,否则它将返回bar
。在你的情况下,原始代码将
true
或false
传递给 SetNoClip,而在其他示例中,你要么将"water"
或布尔值传递给 SetNoClip。SetNoClip 可能无法处理字符串。