1 (изменено: stealzy, 2016-09-05 13:26:28)

Тема: AHK: Проверка вхождения в массив

Часто вместо массивов используется объединение всех переменных в одну строку.
Проверить наличие переменной в таком "массиве" несложно: IfInString, переменная, массив.
Также можно написать (x ~= "MyRegExp1|MyRegExp2|MyRegExp3").

Можно ли так же лаконично проверять это в настоящих массивах?
Пока не придумал ничего лучше, чем написать самописную функцию:

Array:=[1, 5, 7], x:=3, y:=5
MsgBox % indexOf(x, Array) " | " indexOf(y, [8, 5, 0, 5], 3)

; Возвращает индекс первого вхождения значения в массиве.
; Индекс массива, с которого начинается поиск. Если параметр fromIndex опущен, то поиск начинается с индекса 1.
indexOf(var, Arr, fromIndex:=1) {
	Loop % Arr.MaxIndex() - fromIndex + 1
		If (var = Arr[A_Index + fromIndex - 1])
			Return A_Index + fromIndex - 1
	Return false
}

В js у массивов есть метод indexOf(var), в php есть ф-ия in_array(x, Array).
А это питон:

if 'a' in ['a','b','c']:
    print "YES"
else:
    print "NO"

Круто, да?
Я постоянно встречаю в чужих скриптах разные конструкции, склеивающие список значений в одну строку, затем парсящие эту строку (бр-р-р), и сам иногда пишу код вида (x=a || x=b || ... || x=e). Хотелось бы делать это красиво и просто, такие дела.

2

Re: AHK: Проверка вхождения в массив

Может, на коллекции перейти?

List := {0:"", 2:"", 4:"", 6:"", 8:""}
Loop % List.Length()
msgBox % (List.HasKey(A_Index) ? "есть" : "нет") " "A_Index