Что нового

Тернарный оператор - выполнение только совпавшего условия

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Данная функция это аналог _Iif, за исключением того, что она работает почти также (по функционалу) как тернарные операторы в других ЯП.

Использование стандартной функции _Iif имеет небольшой(?) недостаток - при проверке, выполняются функции в обеих условиях, даже если они не совпадают с проверкой в первом параметре.

Эта полезняшка помогает в какой то мере обойти этот недостаток:

Код:
;Расширенная функция _IifEx позволяющая предотвратить выполнение условного параметра

$iTest = 1 ;0

$iTimer = TimerInit()

_IifEx($iTest = 1, 'Sleep(1500)', 'Sleep(2500)')

ConsoleWrite('TimerDiff: ' & Round(TimerDiff($iTimer) / 1000, 2) & ' sec.' & @LF)

Func _IifEx($fTest, $vTrueVal, $vFalseVal, $bExecVal = True)
	Local $vVal
	
	If $fTest Then
		$vVal = $vTrueVal
	Else
		$vVal = $vFalseVal
	EndIf
	
	If $bExecVal Then
		$vVal = Execute($vVal)
	EndIf
	
	Return $vVal
EndFunc


Идея в том, чтобы передавать параметры значении в виде строки, а дальше уже по необходимости, выполнять нужное значение (через Execute).


P.S.
Execute замедляет работу скрипта, т.ч не используйте данный метод если скорость для вас это фактор.
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Где это можно применить?
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Belfigor [?]
Где это можно применить?
Везде :smile:.
Ну например там, где нужно много раз проверять условия и выполнять некие действия.
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
А можно какой-нибудь банальный примерчик который например определенные MessageBox будет выводить, я просто как-то вообще не представляю где это и как применить :-\
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Belfigor [?]
можно какой-нибудь банальный примерчик
Есть же пример в первом сообщении.

Вот с MsgBox:

Код:
$iTest = 1

_IifEx($iTest = 1, 'MsgBox(64, "Hello", "$iTest = 1")', 'MsgBox(48, "Hello", "$iTest Not = 1")')
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Ого, вот это круть! :laugh:
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
То есть это:
Код:
$iTest = 1

_IifEx($iTest = 1, 'MsgBox(64, "Hello", "$iTest = 1")', 'MsgBox(48, "Hello", "$iTest Not = 1")')

альтернатива этому:
Код:
$iTest = 1

If $iTest = 1 Then
   MsgBox(64, "Hello", "$iTest = 1")
else
   MsgBox(48, "Hello", "$iTest Not = 1")
Endif

?
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Забыл добавить...
“Execute замедляет работу скрипта, т.ч не используйте данный метод если скорость для вас это фактор”.

Zaramot [?]
альтернатива этому
Да, и также результат выполнения функции возвращается от _IifEx.
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
А такой If можно "вбахать" ?
Код:
$Var = 1
If $Var = 1 Then
   Sleep(1000)
   MsgBox(0, 'Hello', 'Hello World')
   Sleep(1000)
   Exit
Else
   Sleep(5000)
   ToolTip('Hello World')
   Beep(500, 500)
   Exit
EndIf


То есть пару строк вписать...
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Zaramot [?]
А такой If можно "вбахать" ?
Можно, правда выход нужно будет делать через некую функцию (Execute не умеют запускать её):

Код:
_IifEx($iTest = 1, '_Exit(Sleep(1000)+MsgBox(0, "Hello", "Hello World")+Sleep(1000))', '_Exit(Sleep(5000)+ToolTip("Hello World")+Beep(500, 500))')

Func _Exit($iDummy)
	Exit
EndFunc



P.S.
Функция предназначена совсем для других целей.
 
Верх