1

Тема: AHK: Вопросы по объектам

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

Object1 := {}
Object1.Property1 := {"sector_1": "VALUE 1-1", "sector_2": "VALUE 1-2"}
Object1.Property2 := {"sector_1": "VALUE 2-1", "sector_2": "VALUE 2-1"}

FOR k, v in Object1.Property1 ;Так работает
MsgBox % k "`t" v

x := 2
FOR k, v in Object%x%.Property1 ;Так не работает
MsgBox % k "`t" v

2

Re: AHK: Вопросы по объектам

x := 1
По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.27.03 (Unicode 32-bit).

3

Re: AHK: Вопросы по объектам

Это имущество называется свойством.

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

4

Re: AHK: Вопросы по объектам

Не так пример составил. Вот так правильно:

Object1 := {}
Object1.Property1 := {"sector_1": "VALUE 1-1", "sector_2": "VALUE 1-2"}
Object1.Property2 := {"sector_1": "VALUE 2-1", "sector_2": "VALUE 2-2"}

y := Object1.Property2
FOR k, v in y  ;Так работает
MsgBox % k "`t" v

/*
y := 2
FOR k, v in Object1.Property%y%  ;Так не работает
MsgBox % k "`t" v
*/

Вопрос всё тот же: как обратиться к свойству объекта, используя переменную как часть имени? Хочется без промежуточных переменных.

5

Re: AHK: Вопросы по объектам

Object1 := {}
Object1.Property1 := {"sector_1": "VALUE 1-1", "sector_2": "VALUE 1-2"}
Object1.Property2 := {"sector_1": "VALUE 2-1", "sector_2": "VALUE 2-2"}


y := 2
FOR k, v in Object1["Property" . y]
MsgBox % k "`t" v
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

6

Re: AHK: Вопросы по объектам

Object1 := {}
Object1.Property2 := {"sector_3": "VALUE"}

x := 1
y := 2
z := 3

Как вывести в MsgBox значение, "координаты" которого находятся в переменных x, y, z?

  • x соответствует Object

  • y соответствует Property

  • z соответствует sector_

7 (изменено: serzh82saratov, 2017-11-20 22:56:00)

Re: AHK: Вопросы по объектам

Object1 := {}
Object1.Property2 := {"gector_3": "VALUE","sector_3": "VALUE"}
Object3 := {}
Object3.Property2 := {"sector_1": "VALUE","gector_1": "VALUE"}

А какова логика? Чему и почему соответствует z := 3 в данных случаях?

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.27.03 (Unicode 32-bit).

8

Re: AHK: Вопросы по объектам

Я думаю так:

Object1 := {}
Object1.Property2 := {"sector_3": "VALUE"}

x := 1
y := 2
z := 3

MsgBox, % Object%x%["Property" . y]["sector_" . z]
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

9

Re: AHK: Вопросы по объектам

Ага, логично.

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.27.03 (Unicode 32-bit).

10

Re: AHK: Вопросы по объектам

serzh82saratov, я в рамках примера спрашивал, z - это часть имени единственного ключа.
teadrinker, спасибо, то что нужно!

11

Re: AHK: Вопросы по объектам

ypppu пишет:

единственного ключа

Эх, я думал и такое будет:


Object1 := {}
Object1.Property2 := {"sector_3": "VALUE"}

x := 1
y := 2
z := 3

a = Object
b = Property
c = sector_

MsgBox, % %a%%x%[b . y][c . z]
По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.27.03 (Unicode 32-bit).

12

Re: AHK: Вопросы по объектам

Это кому-нибудь точно пригодится!

13

Re: AHK: Вопросы по объектам

Если вам оно не надо, и имена всегда постоянные, то по сути интересны только индексы, мне кажется проще так организовать:


Obj := [[,[,,"VALUE"]]]

x := 1
y := 2
z := 3

MsgBox, % Obj[x][y][z]
По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.27.03 (Unicode 32-bit).

14 (изменено: ypppu, 2017-11-28 22:58:15)

Re: AHK: Вопросы по объектам

Аналогичный вопрос по записи в ассоциативный массив, который является свойством объекта.
Как записать "VALUE" в массив, использовав в качестве "координат" переменные?

Object1 := {} 
a := 1
b := 2
c := 3

Object1.Property2["Sector3"] := "VALUE"

MsgBox, % Object1.Property2["Sector3"]

Знаю, что подставить "a" вместо единицы можно так:

Object%a%.Property2["Sector3"] := "VALUE"

А как быть с "b" и "с"?

15

Re: AHK: Вопросы по объектам

Так было же.

MsgBox, % Object%a%["Property" b]["Sector" c]
По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.27.03 (Unicode 32-bit).

16

Re: AHK: Вопросы по объектам

Уточнил.
Там речь шла о том, как считать "VALUE" из массива, используя переменные. А как записать "VALUE" в массив?

17 (изменено: serzh82saratov, 2017-11-28 23:10:52)

Re: AHK: Вопросы по объектам


a := 1
b := 2
c := 3

Object%a% := {} 
Object%a%["Property" b] := {}
Object%a%["Property" b]["Sector" c] := "VALUE"

MsgBox % Object1.Property2["Sector3"]

или


a := 1
b := 2
c := 3

Object%a% := {} 
Object%a%["Property" b] := {"Sector" c:"VALUE"}

MsgBox % Object1.Property2["Sector3"]

Не знаю контекст, но ещё раз посоветую как в 13 посте.

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.27.03 (Unicode 32-bit).

18

Re: AHK: Вопросы по объектам

Спасибо, помог! Это получается вложенный (двумерный) массив? И его также необходимо инициализировать?

19

Re: AHK: Вопросы по объектам

Object1.Property2.Sector3 := "VALUE"
Object1.Property2["Sector3"] := "VALUE"

Не знаю почему они отличаются, но первый вариант не делает "Property2" объектом.

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.27.03 (Unicode 32-bit).

20

Re: AHK: Вопросы по объектам

Хотя ещё интереснее, они оба не объекты.

Object1 := {}
MsgBox % IsObject(Object1.Property2.Sector3)
MsgBox % IsObject(Object1.Property2["Sector3"])
По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.27.03 (Unicode 32-bit).

21

Re: AHK: Вопросы по объектам

Вот так, согласно справке, будет создаваться объект:

Object1 := {}
Object1["Property2", "Sector3"] := "VALUE"
MsgBox, % IsObject(Object1.Property2)
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

22

Re: AHK: Вопросы по объектам

Значит это работает не по справке.

Object1.Property2["Sector3"]
По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.27.03 (Unicode 32-bit).

23

Re: AHK: Вопросы по объектам

Да, странно.

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

24

Re: AHK: Вопросы по объектам

Да, забыл про такую запись, проще так тогда.

a := 1
b := 2
c := 3
(Object%a%:={})["Property" b, "Sector" c] := "VALUE"
MsgBox % Object%a%["Property" b, "Sector" c]
По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.27.03 (Unicode 32-bit).

25

Re: AHK: Вопросы по объектам

Попробовал разные способы сохранения данных в массив, принадлежащий объекту. Для удобства разбил на блоки, чтобы можно было быстро закомментировать.

+ открыть спойлер
a := 1
b := 2

c := 3
d := 4
e := 5


/*
;блок-1
Object%a% := {}
Object%a%["Property" b, "Sector" c] := "VALUE_C"
Object%a%["Property" b, "Sector" d] := "VALUE_D"
Object%a%["Property" b, "Sector" e] := "VALUE_E"
*/


/*
;блок-2
Object%a% := {} 
Object%a%["Property" b] := {}
Object%a%["Property" b]["Sector" c] := "VALUE_C"
Object%a%["Property" b]["Sector" d] := "VALUE_D"
Object%a%["Property" b]["Sector" e] := "VALUE_E"
*/


/*
;блок-3
 Object%a% := {}
(Object%a%:={})["Property" b, "Sector" c] := "VALUE_C"
(Object%a%:={})["Property" b, "Sector" d] := "VALUE_D"
(Object%a%:={})["Property" b, "Sector" e] := "VALUE_E"
*/


/*
; блок-4
Object%a% := {} 
Object%a%["Property" b] := {"Sector" c:"VALUE_C"}
Object%a%["Property" b] := {"Sector" d:"VALUE_D"}
Object%a%["Property" b] := {"Sector" e:"VALUE_E"}
*/



MsgBox % Object%a%["Property" . b]["sector" . c]   "`n"   Object%a%["Property" . b]["sector" . d]   "`n"   Object%a%["Property" . b]["sector" . e]
MsgBox % Object%a%["Property" b, "Sector" c]       "`n"   Object%a%["Property" b, "Sector" d]       "`n"   Object%a%["Property" b, "Sector" e]
MsgBox % Object%a%.Property2["Sector" c]           "`n"   Object%a%.Property2["Sector" d]           "`n"   Object%a%.Property2["Sector" e]

MsgBox % Object1["Property2"]["Sector3"]
MsgBox % Object1["Property2", "Sector4"]
MsgBox % Object1.Property2["Sector5"]
MsgBox % Object1.Property2.Sector5

Блоки №1 и №2 исправно добавляют данные в массив, принадлежащий объекту.
Блоки №3 и №4, судя по всему, затирают весь массив перед добавлением данных.

Внизу попробовал вывести значения в MsgBox известными мне способами с использованием переменных.