1

Тема: AHK: if * = * or * or * - как правильно составить?

Приветствую читающего этот текст форумчанина.
Вопрос: как правильно составить условие if'a, чтобы переменная могла = ТЕКСТУ1 или тексту2 или тексту3?


if Var = Arthas or Stone or Tree
{
msgbox, asd
}

Надеюсь на вашу помощь.

2

Re: AHK: if * = * or * or * - как правильно составить?

А что справка по этому поводу говорит?

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

3

Re: AHK: if * = * or * or * - как правильно составить?

Самый простой способ заключать каждое выражение в скобки:

if (выражение1) or ((выражение2) and (выражение3)) or (!выражение4) {
}
Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

4

Re: AHK: if * = * or * or * - как правильно составить?

Проще использовать in *,*,*

5

Re: AHK: if * = * or * or * - как правильно составить?

Можно еще циклом по массиву.

array:=["Arthas","Stone","Tree"]
text:="Stone"
for i,value in array
	if(value=text) ;если нужно соблюдать регистр, то == 
		msgbox % "i=" i "`n" value

6

Re: AHK: if * = * or * or * - как правильно составить?

Массивом самое верное:

arr := ["Arthas", "Stone", "Tree"]
if HasValue("Stone", arr)
	MsgBox ;% "Ключей с искомым значением найдено - " HasValue("Stone", arr).Length() ",`nпервый по порядку ключ - " HasValue("Stone", arr).1

HasValue(var, arr) {
	arrOfKeys := {}
	for key, value in arr
		if (value == var)
			arrOfKeys.Push(key)
	return (arrOfKeys.Length() = 0) ? false : arrOfKeyss
}

Для простых случаев можно использовать InStr:

MsgBox % InStr("Arthas|Stone|Tree", "Stone")

или regex:

if "Arthas|Stone|Tree" ~= "Artha"
	MsgBox

7

Re: AHK: if * = * or * or * - как правильно составить?

stealzy пишет:

Для простых случаев можно использовать InStr:

MsgBox % InStr("Arthas|Stone|Tree", "Stone")

Я б так не делал:

var := "art"
MsgBox % InStr("Arthas|Stone|Tree", var) 
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

8 (изменено: stealzy, 2018-12-26 18:05:07)

Re: AHK: if * = * or * or * - как правильно составить?

Ну поэтому и пишу что правильнее через массив. Изящного пути тут нет.

list := "Arthas|Stone|Tree", var := "Stone"
if HasValue(var, StrSplit(list, "|"))
	MsgBox ;% "Ключей с искомым значением найдено - " HasValue("Stone", arr).Length() ",`nпервый по порядку ключ - " HasValue("Stone", arr).1

HasValue(var, arr) {
	arrOfKeys := {}
	for key, value in arr
		if (value == var)
			arrOfKeys.Push(key)
	return (arrOfKeys.Length() = 0) ? false : arrOfKeyss
}

9 (изменено: Malcev, 2018-12-26 18:35:32)

Re: AHK: if * = * or * or * - как правильно составить?

Я когда ничего не знал о массивах делал так:

list := "|Arthas|Stone|Tree|"
var := "Stone"
If InStr(list, "|" var "|")
   msgbox

До сих пор использую.

10

Re: AHK: if * = * or * or * - как правильно составить?

И для полноты картины, стоит упомянуть, что массивы - это объекты:


list := "Arthas|Stone|Tree", var := "Stone"

proto := []
proto.HasValue := Func("__HasValue")
proto.Split := Func("__Split")
proto.lastScan := {}

arr := New proto
;arr.Push("Arthas", "Stone", "Tree")
arr.Split(list)
arr.HasValue("Stone")

MsgBox % Format("Ключей с искомым значением найдено - {}`nПервый по порядку ключ - {}", arr.lastScan.count, arr.lastScan.keys[1])

__HasValue(this, value) {
	this.lastScan := {"count": 0, "keys": []}
	For key, item in this {
		if (item == value) {
			this.lastScan.count++
			this.lastScan.keys.Push(key)
		}
	}
}
__Split(this, string) {
	this.Push( StrSplit(string, "|")* )
}