Автор Тема: Тернарный оператор - выполнение только совпавшего условия  (Прочитано 4787 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827
  • Репутация: 2288
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Данная функция это аналог _Iif, за исключением того, что она работает почти также (по функционалу) как тернарные операторы в других ЯП.

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

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

Код: AutoIt [Выделить]
;Расширенная функция _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 замедляет работу скрипта, т.ч не используйте данный метод если скорость для вас это фактор.
« Последнее редактирование: Декабрь 02, 2012, 21:27:24 от CreatoR »


Правила, Поиск, Супер тема


AutoIt is simple, subtle, elegant.


«Не оказываю тех. поддержку через ПМ/ICQ, и по электронной почте - для этого есть форум. (C)»
«Законы Мэрфи неоспоримы!»


Мои работы

Русское сообщество AutoIt


Оффлайн Belfigor [?]

  • Локальный модератор
  • *
  • Сообщений: 3492
  • Репутация: 927
    • Награды
  • Версия AutoIt: 3.3.14.0
Где это можно применить?

Любые темы внутри раздела "Разработка ботов" не названные в соответствии с правилами раздела, будут закрываться.
Любой ответ, любого пользователя в теме с предупреждением, направленный на решение вопроса, произведенный до того как предупреждение было исправлено, приведет к закрытию темы и удалению всего что было после предупреждения.

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827

  • Автор темы
  • Репутация: 2288
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Belfigor  [?]
Цитировать
Где это можно применить?
Везде :).
Ну например там, где нужно много раз проверять условия и выполнять некие действия.

Оффлайн Belfigor [?]

  • Локальный модератор
  • *
  • Сообщений: 3492
  • Репутация: 927
    • Награды
  • Версия AutoIt: 3.3.14.0
А можно какой-нибудь банальный примерчик который например определенные MessageBox будет выводить, я просто как-то вообще не представляю где это и как применить  :-\

Русское сообщество AutoIt

Re: Тернарный оператор - выполнение только совпавшего условия
« Ответ #3 Отправлен: Декабрь 02, 2012, 15:17:38 »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827

  • Автор темы
  • Репутация: 2288
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Belfigor  [?]
Цитировать
можно какой-нибудь банальный примерчик
Есть же пример в первом сообщении.

Вот с MsgBox:

Код: AutoIt [Выделить]
$iTest = 1

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


Оффлайн Belfigor [?]

  • Локальный модератор
  • *
  • Сообщений: 3492
  • Репутация: 927
    • Награды
  • Версия AutoIt: 3.3.14.0
Ого, вот это круть!  :laugh:

Оффлайн Zaramot [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1160
  • Репутация: 655
  • Пол: Мужской
  • I ♥ AutoIt
    • Награды
  • Версия AutoIt: 3.3.8.1
То есть это:
Код: AutoIt [Выделить]
$iTest = 1

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

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

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

?

Оффлайн Belfigor [?]

  • Локальный модератор
  • *
  • Сообщений: 3492
  • Репутация: 927
    • Награды
  • Версия AutoIt: 3.3.14.0

Русское сообщество AutoIt

Re: Тернарный оператор - выполнение только совпавшего условия
« Ответ #7 Отправлен: Декабрь 02, 2012, 21:01:59 »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827

  • Автор темы
  • Репутация: 2288
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Забыл добавить...
“Execute замедляет работу скрипта, т.ч не используйте данный метод если скорость для вас это фактор”.

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

Оффлайн Zaramot [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1160
  • Репутация: 655
  • Пол: Мужской
  • I ♥ AutoIt
    • Награды
  • Версия AutoIt: 3.3.8.1
А такой If можно "вбахать" ?
Код: AutoIt [Выделить]
$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 [?]

  • Администратор
  • *
  • Сообщений: 7827

  • Автор темы
  • Репутация: 2288
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Zaramot  [?]
Цитировать
А такой If можно "вбахать" ?
Можно, правда выход нужно будет делать через некую функцию (Execute не умеют запускать её):

Код: AutoIt [Выделить]
_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.
Функция предназначена совсем для других целей.
   

Русское сообщество AutoIt

Re: Тернарный оператор - выполнение только совпавшего условия
« Ответ #10 Отправлен: Декабрь 03, 2012, 01:10:21 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
4 Ответов
2383 Просмотров
Последний ответ Сентябрь 24, 2011, 21:30:45
от agikon
9 Ответов
3318 Просмотров
Последний ответ Октябрь 17, 2011, 12:54:41
от Petro78
2 Ответов
2332 Просмотров
Последний ответ Июнь 18, 2012, 02:29:41
от idbehold
4 Ответов
1962 Просмотров
Последний ответ Декабрь 05, 2012, 22:15:27
от Kaster
7 Ответов
2879 Просмотров
Последний ответ Июнь 02, 2013, 10:49:35
от den23rus
0 Ответов
725 Просмотров
Последний ответ Март 14, 2014, 20:26:13
от Ksaan
7 Ответов
1061 Просмотров
Последний ответ Февраль 12, 2017, 19:27:29
от inververs
2 Ответов
394 Просмотров
Последний ответ Апрель 25, 2017, 18:02:51
от sasha-ld
3 Ответов
652 Просмотров
Последний ответ Апрель 30, 2017, 16:12:34
от Garrett
7 Ответов
636 Просмотров
Последний ответ Август 01, 2017, 09:10:46
от ra4o