1 (изменено: belyankin12, 2017-05-28 20:15:45)

Тема: AHK: Функция Switch

Здравствуйте, недавно узнал об хорошей функции, которая позволяет забыть о десятках строчек с if/else и сделать все более компактными. Написал простенький скрипт, чтобы проверить эту функцию, но при запуске скрипт выдает ошибку, что функция switch - это неизвестная команда. Прилагаю код, вопрос собственно следующий: это я неправильно где-то синтаксис прописал, или для switch нужно отдельную функцию писать? Если нужно отдельную функцию, можете её мне дать?

global error := "Не пренадлежит [1-3]"

Random, rand, 1, 3

switch (rand) {
	case 1: var := "Один";
	case 2: var := "Два";
	case 3: var := "Три";
	Default: var := "" . error . "";
}

msgbox, % var
Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

2

Re: AHK: Функция Switch

belyankin12
В префиксе заголовка темы не используйте квадратные скобки. Посмотрите, как у остальных.

3

Re: AHK: Функция Switch

JSman, привычка с другого форума, так и думал что где-то закосячил(.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

4

Re: AHK: Функция Switch

belyankin12, почему бы вам не изучить справку по функциям. Ну или любую книгу по основам программирования?

5

Re: AHK: Функция Switch

stealzy, я воспринимаю лучше человеческую речь, а не заумные книжечки и справки. Человека спросить можно, а справку нет.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

6

Re: AHK: Функция Switch

Один человек подошел к рыбаку и умолял его дать ему рыбу. Старый рыбак в ответ промолвил: «Вместо того, чтобы дать тебе рыбу и пропитание на один раз, не лучше было бы, если бы я показал тебе, как рыбачить? Тогда ты смог бы прокормить себя». Однако человек ответил, что его не интересует процесс обучения ловле рыбы. Голод, разгулявшийся в его желудке, подавил жажду знаний.

7 (изменено: belyankin12, 2017-05-28 20:28:59)

Re: AHK: Функция Switch

Раз вы так воспринимаете это то и ладно. Я подожду того, кто захочет мне рыбу дать. Да и этот форум создан для того, чтобы рыбки давать друг-другу.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

8

Re: AHK: Функция Switch

teadrinker пишет:

задачей форума не является писать желающим скрипты, а помогать писать скрипты людям, желающим научиться это делать

http://forum.script-coding.com/viewtopi … 013#p48013

9

Re: AHK: Функция Switch

Ну так мне кто-то объяснит, это синтаксис неверный или функцию писать нужно? Вы все глазами в два слова уперлись и думаете что я от вас требую писать мне функцию, вот только есть третье слово, откройте глаза и подумайте над его смыслом.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

10

Re: AHK: Функция Switch

belyankin12, много зависит от желания. Если видно, что человеку не очень то и надо, то и помогать не очень то и хочется.

11

Re: AHK: Функция Switch

belyankin12, если хотите понять как работают функции, то читайте про функции.
В справке на русском всё подробно написано.
Если хотите записать if else одной строкой читайте в английской справке - Ternary operator.

12 (изменено: belyankin12, 2017-05-28 21:17:46)

Re: AHK: Функция Switch

ypppu, возможно моя манера выражаться заставила вас подумать об этом. Ваша позиция мне ясна и я не требовал ничего от вас кроме подсказок.

Malcev, как функции работают я представляю. Несколько я сам себе писал, тут вопрос немного другой. Я знаю, что вот этот код рабочий: мне скинули его со словами: "Тебе эта штука поможет очень сильно". Но сейчас связи с тем, кто мне предоставил этот код, у меня нету, а задумка реально полезная. Мне непонятно, чего не хватает скрипту для этой команды.

В гугл есть скверные результаты по поводу этой команды, да и те на английском. Другой вопрос: кто-то вообще знает что это такое? Или вы просто сами впервые видите такое, а я вас тут допрашиваю?)

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

13

Re: AHK: Функция Switch

belyankin12 пишет:

Мне непонятно, чего не хватает скрипту для этой команды.

Если у вас цель запустить выполнение джаваскрипта из автохотки, то это уже обсуждалось:
http://forum.script-coding.com/viewtopic.php?id=9101

14 (изменено: belyankin12, 2017-05-28 21:25:18)

Re: AHK: Функция Switch

Malcev, вот в чем проблема. Это яваскрипт, понятно... Что-ж, спасибо. Как только я решу эту проблему, я выложу сюда рабочий вариант.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

15

Re: AHK: Функция Switch

belyankin12, в первом сообщении очень противоречивая информация. Вы откуда-то взяли функцию, не описали толком её предназначения. При этом и на 200% уверены, что оно очень полезная. Потом даёте какой-то кусок кода со словами "Я написал, но он не работает. Дайте мне такой, чтобы работал."

То есть на данный момент Вы даже не сформулировали свою задачу.

16 (изменено: belyankin12, 2017-05-28 21:51:57)

Re: AHK: Функция Switch

ypppu, я не догадывался, что это функция другого языка. Мне её скинул тот, кто использует её же на АХК (мне был скинут .ahk скрипт, с этой функцией). А раз это ahk, я был уверен, что вы что-то знаете об этой функции, ведь такая полезная вещь не могла просто пройти мимо вас. Покажу на примере, что она делает.


global error := "Не принадлежит [1-3]"
Random, rand, 1, 3

} else if (rand = 1) {
	var = Один
} else if (rand = 2) {
	var = Два
} else if (rand = 3) {
	var = Три
} else {
	var = %error%
}
msgbox, %var

Это то, как я сейчас делаю по обычному. Эта же функция позволяет избавиться от if/else, сократив код. Так понятно?

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

17

Re: AHK: Функция Switch

Непонятно, опишите алгоритм словами.

18 (изменено: stealzy, 2017-05-28 22:24:20)

Re: AHK: Функция Switch

belyankin12, в AutoHotkey (в отличие от js, AutoIt и других) нет оператора switch/case, увы.
В вашем случае (когда одна переменная сопоставляется другой) можно обойтись массивом:

a:=["Один","Два","Три"]
MsgBox % (a[2] = "") ? "Не принадлежит массиву" : a[2]
MsgBox % (a[4] = "") ? "Не принадлежит массиву" : a[4]

19

Re: AHK: Функция Switch

ypppu, бывают случаи, в зависимости от того, чему будет равна определенная переменная, нужно чтобы другая переменная принимала определенное значение (if rand = 1, var = Один; if rand = 2, var = Два и т.д.). Сейчас, я это условие прописываю благодаря ряду if/else (пример пост №16). Эта же функция позволяет не использовать if/else, а прописать switch, где в скобках указывается название переменной, в зависимости от которой, другая переменная будет принимать определенное значение (switch (rand) ), после case прописывается значение (case 1: эквивалентно if (rand = 1) {) и после прописывается следствие: var = Один. Получается

case 1: var := "Один";


эквивалентно

if (rand = 1) { 
var = Один
}
Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

20

Re: AHK: Функция Switch

stealzy, мой случай - всего лишь пример. Я просто не стал показывать полный код, ибо тему перенесли бы в раздел ahk games, куда не так много людей заглядывает.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

21

Re: AHK: Функция Switch

stealzy, возможно и устраивает, я сделал вывод только из вашего описания ("одна переменная сопоставляется другой"), что мне это не подходит. Можете показать пример попроще? Массив мне понятен, а вот символы в msgbox'ах не совсем.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

22 (изменено: stealzy, 2017-05-28 22:42:01)

Re: AHK: Функция Switch

a:=["Один","Два","Три"], b:={one: "Один", two: "Два", three: "Три"}
MsgBox % a[2] " | " b.one
MsgBox % a[4] " | " b["two"]

23

Re: AHK: Функция Switch

stealzy, хм... Как бы так объяснить... Мне нужно чтобы в зависимости от значения var1, переменная var2 принимала определенное значение. А если переменная var1 в этот момент не равно ничему из перечисленного, то var2 принимала какое-то значение (смотрите пост 16). Как мне поможет массив? Может быть вы модифицируете мой код из поста 16, показав мне, так сказать, наглядно?

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

24 (изменено: Malcev, 2017-05-28 22:46:37)

Re: AHK: Функция Switch

list := {1:"Один", 2:"Два", 3:"Три"}
Random, rand, 1, 5
msgbox % rand "`n" var := list[rand]="" ? "Не пренадлежит [1-3]" : list[rand]

Читайте про Ternary operator.

25 (изменено: belyankin12, 2017-05-28 23:06:21)

Re: AHK: Функция Switch

Malcev, убрав все непонятные символы я таки понял что Вы со Stealzy хотели мне донести. Непонятно только следующее: если rand не принадлежит [1-3], то list[rand] будет пустой, как мне прописать условие, чтобы пустая list[rand] приобретала какое-то определенное значение (т.е. все, что не принадлежит [1-3] приобретало бы, например, значение false). Вот мой код:

list := {1:"Один", 2:"Два", 3:"Три"}
Random, rand, 1, 5
msgbox, % list[rand]
Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

26 (изменено: belyankin12, 2017-05-28 23:06:10)

Re: AHK: Функция Switch

stealzy, если нету желания помогать, то и не нужно делать это через силу, из жалости или по любым другим причинам. Я прихожу сюда для того, чтобы мне объяснили, рассказали, помогли, а не посылали книжки читать. По вашей логике от этого форума нету толку, можно же пойти книжки почитать.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

27 (изменено: Malcev, 2017-05-28 23:15:28)

Re: AHK: Функция Switch

var := list[rand]="" ? "Не пренадлежит [1-3]" : list[rand]
Такая запись означает, что если list[rand] будет равно ничему, то var будет равно "Не пренадлежит [1-3]", в противном же случае, var будет равно list[rand].
belyankin12, почему вы упорно не хотите почитать про тернарные операции.
Или религия не позволяет?

28 (изменено: belyankin12, 2017-05-28 23:24:26)

Re: AHK: Функция Switch

Malcev, да я то прочитал.. Только мой английский не позволяет все уловить полностью. Но мне кажется сейчас я начинаю понимать, благодаря вашим объяснениям. Т.е. эта строчка var := list[rand]="" ? "Не пренадлежит [1-3]" : list[rand] аналогична следующему коду:


if (list[rand] = "") {
	var := "Не принадлежит [1-3]
} else {
	var := list[rand]
}

А символ ":" аналогичен else в моем коде, в то время как символ "?" обозначает "то" (если list[rand]="" то "Не принадлежит [1-3]), верно?

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

29

Re: AHK: Функция Switch

Верно.

30

Re: AHK: Функция Switch

Ура, я все понял. Спасибо большое. А насчёт switch/case, если я все таки найду решение, я вам его предоставлю, вдруг кому полезным будет.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

31

Re: AHK: Функция Switch

Удачи в поисках, .
Ты, это, если философский камень случайно найдешь, дай знать тоже, ок?

32 (изменено: Malcev, 2017-05-28 23:37:38)

Re: AHK: Функция Switch

Если скорость не критична, можно еще так записать:

Random, rand, 1, 5
(rand = 1) && (var := "Один")
(rand = 2) && (var := "Два")
(rand = 3) && (var := "Три")
(rand >3) && (var := "Не пренадлежит [1-3]")
msgbox % rand "`n" var

33

Re: AHK: Функция Switch

stealzy, боюсь камень, что будет превращать все в золото, я никому не отдам. Если бы вы внимательно читали мои посты выше, то поняли бы, что приведенный в первом посте код на AHK работает, просто я какое-то условие не соблюдаю.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

34

Re: AHK: Функция Switch

belyankin12 пишет:

Я прихожу сюда для того, чтобы мне объяснили, рассказали, помогли, а не посылали книжки читать. По вашей логике от этого форума нету толку, можно же пойти книжки почитать.

Вообще лучше всего читать книжки (причём сначала предисловие, введение, содержание). Так удастся въехать в общепринятую терминологию. А спрашивать, если по книжке не понятно или нет перевода. Форум полезен тем, что на нём можно найти готовое решение, или спросить, как лучше составить алгоритм, какими командами его реализовать.

35 (изменено: belyankin12, 2017-05-28 23:48:09)

Re: AHK: Функция Switch

ypppu, вы полностью правы, нельзя стать великим программистом, не обучаясь этому основательно. Но я ведь и не претендую на это звание, я учусь на примерах других простеньким вещам, которые зачастую раскрываются слишком глубоко в разных справочниках (например все та же терминология). Человек с опытом способен все объяснить гораздо проще, я думаю никто спорить не будет, что учитель гораздо полезнее книжки.
За свою такую "наглость", что-ли, не могу подобрать правильного слова, я расплачиваюсь тем, что вы можете отказаться мне помочь по какой-либо причине и вы не будете мне помогать даже если я возьмусь за книжки от безысходности).

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

36

Re: AHK: Функция Switch

belyankin12, еще раз повторю для слоупоков: в AutoHotkey оператора switch/case нет. Просто нет.

37 (изменено: belyankin12, 2017-05-29 00:00:51)

Re: AHK: Функция Switch

stealzy, ещё раз повторю. Я лично видел как этот скрипт работал у другого в файле с расширением .ahk. Я не говорю что это именно те операторы, может быть это просто функция, а эти аргументы были названы так чисто случайно. Но приведенный в первом посте код рабочий! Просто чего-то видимо не хватает скрипту, я попытаюсь узнать чего у того парня, но на это время понадобится.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

38

Re: AHK: Функция Switch

belyankin12, уверяю вас, код в первом посте просто не может работать с расширением ahk. Никак. Ни с функцией, ни без. Там синтаксис, который ahk не поддерживает.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

39 (изменено: stealzy, 2017-05-29 00:23:20)

Re: AHK: Функция Switch

belyankin12 пишет:

приведенный в первом посте код рабочий!

Правда?

belyankin12 пишет:

Просто чего-то видимо не хватает

http://i17.beon.ru/14/77/2237714/5/85022705/x_12ade434.jpeg

но на это время понадобится

Это ты точно подметил .

40

Re: AHK: Функция Switch

teadrinker пишет:

belyankin12, уверяю вас, код в первом посте просто не может работать с расширением ahk. Никак. Ни с функцией, ни без. Там синтаксис, который ahk не поддерживает.

Кто его знает, может как JScript выполняли, или что там вообще. Другой вопрос, что за маньяк это делал, если оно на ahk также:


global error := "Не пренадлежит [1-3]"

Loop
{
	Random, rand, 1, 5
	MsgBox % switch(rand) "`n" rand
}

switch(rand) {
	static list := {1:"Один", 2:"Два", 3:"Три"}
	Return list.haskey(rand) ? list[rand] : error
}
belyankin12 пишет:

А насчёт switch/case, если я все таки найду решение, я вам его предоставлю, вдруг кому полезным будет.

Такая примитивная функция, на другом языке, в разделе ahk, маловероятно.

belyankin12 по поводу рыбы или удочки, согласен с вами, людям далеким от этого, даже русскую справку не одолеть, она всё равно как китайская грамота, первое время только на примерах можно что то понять.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

41 (изменено: Indomito, 2017-06-03 06:21:51)

Re: AHK: Функция Switch

belyankin12 пишет:

Прилагаю код, вопрос собственно следующий: это я неправильно где-то синтаксис прописал, или для switch нужно отдельную функцию писать? Если нужно отдельную функцию, можете её мне дать?

Код не верен ибо функция Switch не реализована в АНК, хотя в C++ оператор switch есть. Можно реализовать это в АНК причём одной функцией.

UPD
Malcev уже дал ответ... я не успел, но мой ответ практически аналогичен.

P.S. Если хочется повозиться, то код который я написал очень давно, т.е.  когда разбирался с АНК, если его поправит то получится в итоге функция Case, надо только понять идею реализации фрагмента кода, и да, он работает в одной игре до сих пор.

+ открыть спойлер
;---
;Main function to dynamically calculate the speed, braking and turning angle corrector, as well as set the flags for timers speed and braking
;---Beginning of function fnGearSpdBrk
fnGearSpdBrk(vParam0, vSpdBrk) ;The values for vSpdBrk (0 - no matter, 1 - speed of the timer, 2 - braking of the timer, 3 and higher - the other subprogramme)
{
;The constants function fnGearSpdBrk and all the subprogrammes who is calling, they are defined above under subprogramme "lVarGameTHQ".
;cFnSB_Learn||cFnSB_Speed||cFnSB_Brake||cFnSB_GT||cFnSB_Boost||cFnSB_Sharp||cFnSB_Turn||cFnSB_Above||
;          1            2            3         4            5            6           7            8

global ;All variables in the function will be global, it is necessary to comment to engage the directive "global" - should not be an empty string.
local fSpdBrk, vMComp, sLabel, vRetFn, vRetResult
static arSpdBrk := ["lFnSB_Learn","lFnSB_Speed","lFnSB_Brake","lFnSB_GT","lFnSB_Boost","lFnSB_Sharp","lFnSB_Turn","lFnSB_Above"] 
static cErFun := "Error in the function `" fnGearSpdBrk `". `n" 
static fRetDone := 0, fRetErr := -1 
  
  sLabel := arSpdBrk[vSpdBrk]
  if (!IsLabel(sLabel))
   {
		 msgbox, % vMsgOptionsEr 
							,Saints Row: The Third
              , %cErFun% Dynamic label with name = "%sLabel%" does not exist.`n`n %сErrOfExit%
              ,30
     ExitApp
    }
  ;a  := arSpdBrk[vSpdBrk]
  ;tooltip %a% = %vSpdBrk%
  vRetFn := fRetDone
  gosub, % arSpdBrk[vSpdBrk]
  if (vRetFn = fRetErr)
    {
		 sbLabel := SubStr(sLabel, 2)
     msgbox, % vMsgOptionsEr 
							,Saints Row: The Third
              , %cErFun% Semantic error in the sub-function = "%sbLabel%" `n`n %сErrOfExit%
              ,30
     ExitApp
    }  

return vRetResult
  
;Fast distillation the car
; cFnSB_Boost := 4
lFnSB_Boost:
  if (fKeyUpTimer) 
      {
        vBoostSpeed++
        if (vBoostSpeed>cBoostSpeed)
            {
              fKeyUpTimer:=false
              gosub lGearAddUp              
              vBoostSpeed := 0
              fKeyUpTimer:=true
              return vRetResult:=false
            }
          else
            return vRetResult:=true
      }
     else
      return vRetResult:=true
      
return vRetFn:=fRetErr

;Fast braking the car
; cFnSB_Sharp := 5
lFnSB_Sharp:
  if (fKeyDnTimer)
      {
        vSharpBrake++
        if (vSharpBrake>cSharpBrake)
            {
              fKeyDnTimer:=false
              gosub lGearAddDn             
              vSharpBrake := 0
              fKeyDnTimer:=true
              return vRetResult:=false ;Allow the timer subroutine work - the speed has changed.
            }
          else
            return vRetResult:=true    ;Forbid the timer subroutine work - speed does not change.        
      }
     else
      return vRetResult:=true         ;If fKeyDnTimer:=false flag allow or deny? As long as I think will be correct - forbid.
          
return vRetFn:=fRetErr

;Block of the control gear shifting
; cFnSB_GT    := 3
lFnSB_GT:
  if (!vRShX)
        return
  if (iGear<>iGearTrc)
        gosub lSetTimerOff
      else
        return
  if (iGear=1)
      {
        fnPlaySoundTHQ(iSoundSpeedMin)
        Goto, lFnSB_GT_Exit 
      }
  if (iGear=cMaxGear)
      {
        fnPlaySoundTHQ(iSoundSpeedMax)
        Goto, lFnSB_GT_Exit
      }  
  if (iGear>=iGearTrc)		
        fnPlaySoundTHQ(iSoundSpeedUp)
      else
        fnPlaySoundTHQ(iSoundSpeedDn)
  lFnSB_GT_Exit:            
      iGearTrc:=iGear			 
      gosub lSetTimerOn
  return     

return vRetFn:=fRetErr

;The block checks the flags and the initial values for the correction of the rotation.
lFnSB_Turn:
    ;fUDLR := True
      Send, {%vParam0% Down}
        sleep %td20_Sleep%
      Send, {%vParam0% Up}    
    ;fUDLR := False    
  return 
      
return vRetFn:=fRetErr
      
;Block checking and setting lock timer - do not touch hands. I'm kidding it
; cFnSB_Speed := 1
; cFnSB_Brake := 2
lFnSB_Speed:
lFnSB_Brake:
  if ((vSpdBrk=cFnSB_Speed) || (vSpdBrk=cFnSB_Brake)) 
      {
        if (fScepl || fUDLR)
            fSpdBrk := true
          else
            fSpdBrk := false

        if ((vSpdBrk=cFnSB_Speed) && (iGear=cMaxGear))
            SetTimer lMoveBrk, off
          else
            SetTimer lMoveBrk, %cTimerBrk%
            
        if ((vSpdBrk=cFnSB_Brake) && (iGear=1))
            SetTimer lMoveUp, off
          else
            SetTimer lMoveUp, %cTimerSpd%
            
        vGearSpdTimer:=vGearSpd//2
        vGearBrkTimer:=vGearBrk//2        
        
        return vRetResult:=fSpdBrk
      }
return vRetFn:=fRetErr
   
;Common subprogramme is not to be verified
; cFnSB_Learn := 0
lFnSB_Learn:
    vGearSpd := (arGear[iGear]+vGearSpd)//2
    vGearBrk := (arGear[iGear]+vGearBrk)//2
    vGearSpdTimer:=vGearSpd//2
    vGearBrkTimer:=vGearBrk//2
    return       
  return vRetFn:=fRetDone

return vRetFn:=fRetErr
      
;While not using - stopgap
; cFnSB_Above := 6
lFnSB_Above: 
return vRetFn:=fRetErr
}
;---End of function fnGearSpdBrk
;---
"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

42

Re: AHK: Функция Switch

Indomito пишет:

Можно реализовать это в АНК причём одной функцией.

В общем случае нельзя, оригинальный switch/case - оператор ветвления (позволяет выполнять те или иные блоки кода в зависимости от значения переменной).
В AHK каждый блок кода придется оформлять отдельной ф-ией, а в массиве записать их имена.
Вот в AHK_H уже можно записать в массив сами блоки кода, но читаемость такого варианта выйдет гораздо хуже if/else.

43

Re: AHK: Функция Switch

belyankin.

Вначале, имеет смысл подумать над тем, что будет выиграно при использовании "switch/case".Поправьте пожалуйста, если ошибаюсь, но по сути, входящее значение будет сравниваться со всеми значениями конструкции, пока не получит соответствие с одной из них. На сколько я это помню из C#. То же самое будет и при "if/else" помещённом внутрь цикла. Тогда, при практическом равенстве функциональности этих шаблонов, преследуя лишь цель удобочитаемости и сокращения кода, нужно так же понимать, что вызываемые инструкции в ответ на соответствующие данные всё равно придётся описывать и наличие "switch/case" не упрощает эту задачу.
Помещаем цикл проверки входящих данных в функцию и функциями же, описываем вызываемые инструкции, ссылки на их вызовы помещаем в объект, а в массиве описываем все варианты входящих значений, на которые нужно реагировать:


objMyFunc:={}
objMyFunc.vasya:=Func("VasyaFunc")
objMyFunc.petya:=Func("PetyaFunc")
objMyFunc.vova:=Func("VovaFunc")
objMyFunc.noname:=Func("NoNameFunc")

incommingValue_01 := "petya"
incommingValue_02 := "kostya"
Global arr:=["vasya","petya","vova"] ; проверяемые значения (case)

objMyFunc[SwitchMyVal(incommingValue_01)].()
objMyFunc[SwitchMyVal(incommingValue_02)].()
objMyFunc[SwitchMyVal("zamanali_sosedi")].()
objMyFunc[SwitchMyVal("vova")].()

ExitApp
SwitchMyVal(val) {
	Loop,% arr.Length() {
		if (arr[A_Index] == val)
			return arr[A_Index]
	}
	return "noname"
}

VasyaFunc() {
	MsgBox,, Title, Вася
}
PetyaFunc() {
	MsgBox,, Title, Петя
}
VovaFunc() {
	MsgBox,, Title, Вова
}
NoNameFunc() {
	MsgBox,, Title, Нет такого имени
}

Тогда получится довольно понятный код, разбитый на категории, где обращение к четырём входящим значениям описывается четырьмя строками. Если функции должны принимать параметры:


objMyFunc:={}
objMyFunc.vasya:=Func("VasyaFunc")
objMyFunc.petya:=Func("PetyaFunc")
objMyFunc.vova:=Func("VovaFunc")
objMyFunc.noname:=Func("NoNameFunc")

incommingValue_01 := "petya"
incommingValue_02 := "kostya"
Global arr:=["vasya","petya","vova"] ; проверяемые значения (case)


objMyFunc[SwitchMyVal(incommingValue_01)].(" счастлив!")
objMyFunc[SwitchMyVal(incommingValue_02)].(". Странные дела творятся...")
objMyFunc[SwitchMyVal("zamanali_sosedi")].(". УБИТЬ СОСЕДЕЙ!!!")
objMyFunc[SwitchMyVal("vova")].()

ExitApp
SwitchMyVal(val) {
	Loop,% arr.Length() {
		if (arr[A_Index] == val)
			return arr[A_Index]
	}
	return "noname"
}

VasyaFunc(fVal:="") {
	MsgBox,, Title, Вася%fVal%
}
PetyaFunc(fVal:="") {
	MsgBox,, Title, Петя%fVal%
}
VovaFunc(fVal:="") {
	MsgBox,, Title, Вова%fVal%
}
NoNameFunc(fVal:="") {
	MsgBox,, Title, Нет такого имени%fVal%
}

Это немного сложнее чем оформление в блоки "if/else", внутри которых бы помещалось и описание инструкций, вынесенных в этом примере в рамки функций, но сложно это только на первый взгляд. Всё описание программы можно выполнить построчно не используя циклов и это будет ещё проще, но ведь Вы прибегаете в этой беседе к технологиям, не имеющим реализации в этом языке, а значит намеренно пытаетесь привнести в свою программу сложности, с помощью которых мог бы быть обретён новый способ описания. Это в первую очередь сообщает, что Вы пытаетесь расти над собой, а значит, разговоры про рыбу и прочее, противоречат этому стремлению и вряд ли могут быть уместны.

44 (изменено: belyankin12, 2017-06-03 22:06:22)

Re: AHK: Функция Switch

KusochekDobra, на момент создания темы я был более чем уверен, что эти операторы - часть AHK. Обратное я узнал уже здесь: когда мне начали про яваскрипт рассказывать и прочее. Мои знания в этом языке пока что ниже среднего, а потому мне ещё рано пытаться сочинять велосипеды .

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

45

Re: AHK: Функция Switch

Пользуйтесь пожалуйста справкой и поиском по форуму и в гугле. Это не просто функционал, который есть по дефолту у подобных площадок, а действительно, очень полезный инструмент. Не могу назвать свои знания хоть сколько-то полноценными, но всё, что мне было нужно, а часто и сверх нужного, как правило, в довольно развёрнутых обсуждениях находилось по поисковому запросу, или на вкладке "Указатель" справки по AHK, а начинать тему нужно разбирая частности, а не фундаментальные принципы, уже истолкованные для множества ситуаций. Это может быть простительно, когда только начинаешь свой забег по "полю с граблями", но если спустя какое-то время ситуация с Вами, не меняется в пользу получения навыков, то со временем, Вас перестанут воспринимать серьёзно зачислив в список неспособных понимать действительность - "as is"(такой, какая она есть). Сейчас я сюда прихожу просто почитать скопившуюся за многие события мудрость и недавно тоже пребывал в уверенности, что знания об AHK сильно фрагментированны, но это совсем не так. Сложность в освоении любого языка программирования с самого начала, не в том, что есть какие-то сложные понятия лежащие в перспективе познания, а в том, что в самой структуре любой из концепций заложена связь всего и со всем одновременно и почти в каждом случае. Невозможно пытаться объяснить какой-либо принцип и не упереться в понимание того, что он тесно связан с другим, а тот, со следующим и так далее... Именно это задаёт сложность с самого начала, а не когда-то "потом" и именно это же задаёт и описательную способность языка, делая инструменты выходящие из-под рук творца - гибкими, а результат их работы - превосходным.

У Вас всё получится! Надо только почаще прибегать к поиску самостоятельно. Каждый из пожелавших помочь опишет лишь только конкретную точку зрения того, как он понимает суть вопроса и как Вам уже должно было стать заметным - не всегда относящуюся к вопросу и это скорее вопиющее ограничение, само по себе упирающееся в ограниченность языка, что в свою очередь обманывает кажущейся простотой - "Спросил -> Рассказали". Когда занимаешься поиском сам, уже не встретишь "барьеров" недопонимания с обратной стороны и всё, что будет найдено - принадлежит Вам!