これは機能します...
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 スタックにプッシュされた引数を取得しますlua_toboolean
。
では、なぜ最初は機能し、2 番目と 3 番目はエラーを返すのでしょうか?
編集:
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 が表示されると、ブール値が渡されなかったことを返します。ブール値リテラルのエラー チェックを削除したのは、(私を含む) 人々は通常、ブール値リテラルではない引数がブール値として正しく扱われることに依存しているためです。