这有效...
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
.
那么为什么第一个工作,第二个和第三个返回错误呢?
编辑:
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,它将返回布尔值未通过。我刚刚删除了对布尔文字的错误检查,因为人们(包括我)通常依赖于不是布尔文字的参数被正确地视为布尔值。