1 (изменено: Military, 2019-01-22 08:15:56)

Тема: AHK: For-loop принцип роботы

Читал справку на английском так и нечего не понял.
Есть такой скрипт:


F3::
For k, v in [1, 2, 3, 4, 5]
{
    SendNumFn := Func("SendNum").Bind(v)
    SetTimer % SendNumFn, % "-" rnd(1, 100)
}
 
SendNum(n) {
    Send % n
}
rnd(min, max) {
        random, ran, min, max
        return ran
}

Возможно кто-то может подробно объяснить каким образом "for k, v in []" работает и в целом заставляет работать этот скрипт.

2 (изменено: belyankin12, 2019-01-22 11:05:38)

Re: AHK: For-loop принцип роботы

Давай на примере обычного луп покажу:


arr := ["abc", "def", "ghj"]
Loop {
	n := A_Index
	if (arr[n] = "") {
		break
	}

	value := arr[n]
	msgbox, % value
}

Вышеприведенный код парсит по очереди все ключи массива arr до того момента пока значения не закончатся, а в переменной value хранится текущее значение массива с ключем n который совпадает с A_Index. Теперь посмотрим на for:


arr := ["abc", "def", "ghj"]
for k, v in arr
{
	msgbox, % v
}

Этот код будет делать абсолютно те же действия и показывать будет те же значения, но он значительно короче. В переменной k хранится значение ключа в текущей итерации цикла (аналог переменной n из первого кода), переменная v хранит значение в массиве arr под ключем k (аналог переменной value в первом коде). Цикл выполняется до тех пор пока v не пустое, а как только v вернет пустоту (значения закончатся в массиве) - цикл прерывается. Ну и конечно всякие break и A_Index работают и в таких циклах.

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

3 (изменено: Military, 2019-01-22 11:59:12)

Re: AHK: For-loop принцип роботы

belyankin12 Спасибо большое теперь стало ясно, а что же делает функция Func.Bind()?
Удивительно сколько всего в таком маленьком коде, если еще учесть генерацию случайных чисел и таймер

4

Re: AHK: For-loop принцип роботы

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

В Вашем первом примере, в теле цикла не прасинг происходит, а обращение к элементам массива по индексу.

Loop - организует цикл, повторяющий своё тело n раз, или бесконечно, если не получил условия.

For - создаёт объект-перечислитель, метод Next() которого, извлекает ключ и его значение свойств объекта по алфавиту до тех пор, пока результат не вернёт пустое значение, если вычисленное выражение является объектом. Справка:


obj := {"count": 4, "item": "book"}
_enum := (obj).NewEnum()
if IsObject(_enum)
    while _enum.Next(Key, Value)
    {
        MsgBox % "Key = " Key "`nValue = " Value
    }

Military, в Вашем примере, строка:

SendNumFn := Func("SendNum").Bind(v)

Сохраняет ссылку в переменной SendNumFn, на функцию с именем SendNum и .Bind(v) - устанавливает значение параметра, который будет передан ей при вызове. Согласно порядку, эти значение будут идти от 1 до 5 включительно по порядку, ключей массива, перечисляемого циклом For.
Далее, строка:

SetTimer % SendNumFn, % "-" rnd(1, 100)

Создаёт то же количество таймеров, вызывающие функцию SendNum, обращаясь к её вызову по ссылке из SendNumFn, которая в свою очередь должна напечатать: "12345", но поскольку таймеры вызываются со случайным интервалом от 1 до 100 миллисекунд, получается случайный порядок печатаемых цифр и поскольку интервал таймера указывается отрицательным, таймер вызывается только один раз для каждой ссылки.

5

Re: AHK: For-loop принцип роботы

Я не брал за основу код ТС ибо по его словам явно видно что он взял этот код только потому что там есть слово for и потому что он работает. Своими словами я объяснил максимально наглядно и просто, пусть и показав только верхушку айзберга. А насчёт парсинга согласен - назвал вещь своим именем просто.

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

6

Re: AHK: For-loop принцип роботы

Загвоздка в том, что называя "вещи" своими именами, Вы используете определения, не относящиеся к контексту, объясняя предмет чужого любопытства. Например, оператор if производит булевы операции, а MsgBox, у Вас демонстрирует содержимое массива с ключом n, переданным в value, который получает значение A_Index на каждой итерации, когда всё это лишь перегружает код. Создаётся впечатление, что Вы намеренно это сделали, только для того, чтобы сравнить возможность более короткой записи, но код, который реализует Вашу логику можно записать и так:


arr := ["abc", "def", "ghj"]
While (arr[ A_Index ])
	MsgBox % arr[ A_Index ]

А если первый элемент массива пустой, Break? Что Происходит в For, в этом случае?

Military пишет:

Читал справку на английском так и нечего не понял.
Есть такой скрипт:
...
Возможно кто-то может подробно объяснить каким образом "for k, v in []" работает и в целом заставляет работать этот скрипт.

По словам ТС, видно, что ему требовалось объяснение примера, который он привёл, а не то, почему, под использованием оператора For, Вы, считаете более короткую запись с Loop.

Так же, парсинг - синтаксический анализ. Относится это определение в первую очередь к обработке больших объёмов текста и в этой сущности, не имеет ничего общего с тем, что Вы подразумеваете под названием этой "вещи" своим именем.

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

7

Re: AHK: For-loop принцип роботы

Мне кажется психолог с вас не получится, товарищ .

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

8

Re: AHK: For-loop принцип роботы

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