Guest kSky7000 Posted February 4, 2011 Share Posted February 4, 2011 Привет! Нужна помощь. Есть кусок кода: Code: function OnEventTargetChanged() local targetId = avatar.GetTarget() or unit.GetPrimaryTarget( avatar.GetId() ) local Gibberling = unit.GetTrioInfo( targetId ) if not targetId or not Gibberling or not unit.IsPlayer( targetId ) then wtMainPanel:Show( false ) return end local trio = unit.GetTrioInfo( targetId ) if trio then --common.LogInfo( common.GetAddonName(), "Ник Второго: ", trio.name2, ", Ник третьего: ", trio.name3 ) wtNickText:SetVal( "value", trio.name2 ) wtNickkText:SetVal( "value", trio.name3 ) end wtMainPanel:Show( true ) end В игре все работает идеально. Но если открыть лог файл mods.txt, то там постоянно появляется ошибка: Code: Error: addon Trio: func: GetTrioInfo, field, line: -1, defined: C, line: -1, [C] Error: addon Trio: func: OnEventTargetChanged, global, line: 18, defined: Lua, line: 16, [string "Mods/Addons/Trio/ScriptTrioInfo.lua"] Error: addon Trio: UI::LuaUnitGetTrioInfo: param 1 not a class GMUIHelper::ObjectId (type: nil), details: int __cdecl UI::LuaUnitGetTrioInfo(struct lua_State *) В lua я сильно не разбираюсь, поэтому прошу помочь. Объясните почему появляется ошибка и как от неё избавиться? Quote Link to comment Share on other sites More sharing options...
duvo Posted February 4, 2011 Share Posted February 4, 2011 Из доков: Quote: unit.GetTrioInfo( unitId )-- параметры: unitId: ObjectId ( not nil ) -- идентификатор игрока Когда цели нет Code: targetId = nilСледовательно Code: unit.GetTrioInfo( targetId ) вызовет ошибку. Избавиться от нее просто: Code: local Gibberling = targetId and unit.GetTrioInfo( targetId ) Quote Link to comment Share on other sites More sharing options...
Guest kSky7000 Posted February 4, 2011 Share Posted February 4, 2011 Спасибо! Очень выручил) Quote Link to comment Share on other sites More sharing options...
icreator Posted February 5, 2011 Share Posted February 5, 2011 а что вообще будет тогда когда and используется? - если там НИЛ то будет 2е значение? а если не НИЛ то первое? тоесть это аналогично: Code: local Gibberling if targetId ~= nil then unit.GetTrioInfo( targetId ) else Gibberling = targetId end а если вместо and использовать or: Code: local Gibberling = targetId or unit.GetTrioInfo( targetId ) Quote Link to comment Share on other sites More sharing options...
Nikon Posted February 5, 2011 Share Posted February 5, 2011 Из документации по ЛУА Quote: Логические операции В Lua это операции and , or , и not . Так же, как и в управляющих конструкциях (§2.4.4), все логические операции рассматривают false и nil как ложь , а все остальное как истину . Операция отрицания not всегда возвращает false или true . Операция конъюнкции and возвращает свой первый параметр, если его значение false или nil ; в противном случае, and возвращает второй параметр. Оператор дизъюнкции or возвращает первый параметр, если его значение отлично от nil и false ; в противном случае, or возвращает второй параметр. И and и or вычисляют второй операнд только в случае необходимости. Примеры: 10 or 20 --> 10 10 or error() --> 10 nil or "a" --> "a" nil and 10 --> nil false and error() --> false false and nil --> false false or nil --> nil 10 and 20 --> 20 (В данном руководстве, --> указывает на результат предшествующего выражения.) Короче, твое 1-е предположение верно, во 2-м вылезет ошибка, если targetId==nil Quote Link to comment Share on other sites More sharing options...
SLA Posted February 6, 2011 Share Posted February 6, 2011 Гайд по булевой логике Lua для Женщин Quote Link to comment Share on other sites More sharing options...
Recommended Posts