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 Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

3

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

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

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

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
Telegram jollycoder

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 Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

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
Telegram jollycoder

9

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

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

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

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 Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

12

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

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

13

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

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


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

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

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

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 Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

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 Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

18

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

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

19

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

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

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

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

20

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

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

Object1 := {}
MsgBox % IsObject(Object1.Property2.Sector3)
MsgBox % IsObject(Object1.Property2["Sector3"])
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

21

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

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

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

22

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

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

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

23

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

Да, странно.

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

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 Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

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 известными мне способами с использованием переменных.

26

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

serzh82saratov пишет:

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

Object1.Property2["Sector3"]

Судя по справке эта запись:

Object1.Property2["Sector3"]

идентична этой:

Object1["Property2", "Sector3"] 

Currently x.y[z]() is treated as x["y", z](), which is not supported. As a workaround, (x.y)[z]() evaluates x.y first, then uses the result as the target of the method call. Note that x.y[z].Call() does not have this limitation since it is evaluated the same as (x.y[z]).Call().

https://autohotkey.com/docs/Objects.htm#Usage_Objects

27

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

Пытаюсь перевести статью Objects, хотя бы самое простое, до Arrays of Arrays. Никак не возьму в толк: массив любого типа является разновидностью объекта? Может кто-нибудь пояснить? Или нарисуйте блок-схему, из которой видно, какое место в AutoHotkey занимают массивы и объекты.

28 (изменено: stealzy, 2017-12-20 16:53:25)

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

+ Class Object
MyObj.MyMethod("Johnny", 123)

class MyObj {
	static Apples := 5
	MyMethod(Param1, Param2) {
		MsgBox, % Param1 " has " this.Apples " apples for " Param2 " customers"
	}
}
+ Associative Arrays
; Simple instance of a class implementation
MyObj := {MyMethod: Func("MyFunction"), Apples: 5}
MyObj.MyMethod("Johnny", 123)

MyFunction(this, Param1, Param2) {
	MsgBox, % Param1 " has " this.Apples " apples for " Param2 " customers"
}
+ Simple Arrays
; Simple array implementation
x := ["a", "b", "c"]
y := {1: "a", 2: "b", 3: "c"}
; x = y
z := {ten: 10, twenty: 20, thirty: 30}
w := {1: 10, 2: 20, thirty: 30, forty: 40}
MsgBox % x.1 "`n" y.2 " " y.MaxIndex() "`n" z.MaxIndex() "`n" w.MaxIndex()

Ассоциативные и обычные массивы по сути одно и тоже, их запись это вопрос синтаксиса.

29

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

Вот такая блок-схема будет верна?

Post's attachments

объекты.PNG 41.42 kb, file has never been downloaded. 

You don't have the permssions to download the attachments of this post.

30

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

Это всё взято из справки. Подпункт Objects - это абзац, в котором написано "For all types of objects, the notation..." и т. д.
Многоточие - это я имел в виду Freeing Objects и Remarks. Дальше уже пошло Extended Usage.


То есть, в итоге, есть какое-то обширное понятие "ОБЪЕКТЫ", которое делится на 4 группы (выделил на картинке синим). Одна из них называется "Object - scriptable associative array". В неё входят Simple Arrays и Associative Arrays. С учётом Extended Usage туда же относятся Function References, Arrays of Arrays и Arrays of Functions.
Так?

31

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

Теперь вроде разобрался.
В той статье рассматривается только первая группа объектов: •Object - scriptable associative array.
Что Arrays, что Associative Arrays - это разновидность •Object - scriptable associative array.
Extended Usage - это раздел, в котором рассматриваются всё те же Arrays и Associative Arrays, но хитрозакрученные.
Ну а в Custom Objects и далее я пока не заглядываю.

32

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

serzh82saratov пишет:
Object1.Property2.Sector3 := "VALUE"
Object1.Property2["Sector3"] := "VALUE"

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

serzh82saratov пишет:

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

Object1 := {}
MsgBox % IsObject(Object1.Property2.Sector3)
MsgBox % IsObject(Object1.Property2["Sector3"])
Object1 := {}

;Object1.Property2.Sector3 := "VALUE"     ;Так Object1.Property2 не объект
Object1.Property2["Sector3"] := "VALUE"   ;Так Object1.Property2 объект
MsgBox % IsObject(Object1.Property2)

;Object1.Property2.Sector3 := {}          ;Так Object1.Property2.Sector3 объект
Object1.Property2["Sector3"] := {}   ;Так тоже Object1.Property2.Sector3 объект

MsgBox % IsObject(Object1.Property2.Sector3)
MsgBox % IsObject(Object1.Property2["Sector3"])

33

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

Объясните, как это работает?
Переменная i согласно документации существует только внутри функции. А объект Object5? Внутри функции мы можем отобразить его свойства в MsgBox. Вне функции - нет.

MyFunc(5)
FOR k, v in Object5.Property1
MsgBox, %k%: %v%
Return


MyFunc(i)
{
Object%i% := {}
Object%i%["Property1", "sector_1"] := "VALUE 1-1"
Object%i%["Property1", "sector_2"] := "VALUE 1-2"

FOR k, v in Object5.Property1   ; <<--------
MsgBox, %k%: %v%
}

Однако, если немного изменить функцию, объект становится также доступен вне функции! Как так получается?

MyFunc(5)
FOR k, v in Object5.Property1
MsgBox, %k%: %v%
Return


MyFunc(i)
{
Object%i% := {}
Object%i%["Property1", "sector_1"] := "VALUE 1-1"
Object%i%["Property1", "sector_2"] := "VALUE 1-2"

FOR k, v in Object%i%.Property1   ; <<--------
MsgBox, %k%: %v%
}

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

34 (изменено: stealzy, 2017-12-30 16:48:42)

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

MyFunc(5)
For k, v in Object5.Property1
	MsgBox % k ": " v

MyFunc(i) {
	Object%i% := {}   ; <<-------- Мерзкий синтаксис, избегаю его также, как и оператор GOTO, потому и не сталкиваюсь наверно.
	Object%i%["Property1", "sector_1"] := "VALUE 1-1"
	Object%i%["Property1", "sector_2"] := "VALUE 1-2"
}

35 (изменено: stealzy, 2017-12-30 17:04:54)

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

Локальность переменных определяется до начала исполнения скрипта, все новые переменные автоматически становятся глобальными.
Proof-of-concept подтверждения гипотезы:

MyFunc(5)
MsgBox % v5

MyFunc(i) {
	v%i% := 42
}

К теме объектов это отношения не имеет.

36

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

Препроцессор - это когда %i% превращается в 5, верно?

Мерзкий синтаксис

В смысле использование препроцессора внутри функции?

Самое главное, если внутри функции при операции с объектами использовать этот самый "препроцессор", то объект автоматом становится глобальным, правильно понимаю?

37 (изменено: stealzy, 2017-12-30 18:33:10)

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

В смысле неявные имена переменных в стиле %x% или z%x%. Обхожусь массивами.
Если до начала исполнения интерпретатор про какие либо переменные не знает, то и свойство локальности они не получат.
А во время исполнения все "проявившиеся" переменные получат глобальную область видимости, интерпретатор видимо не заморачивается по поводу неявных переменных. Формально это баг.

38

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

Хорошо, неявные переменные при исполнении становятся глобальными. А объекты всегда глобальны? По сути, ведь объект - это пространство в памяти, на которое указывает ссылка. Даже если в функции может быть локальная ссылка, она ведь ссылается на глобальный объект?

39 (изменено: stealzy, 2017-12-30 19:34:35)

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

При чем тут объекты, не понимаю? В контексте области видимости это частный случай переменной.

ypppu пишет:

А объекты всегда глобальны?

Вы же вроде проверяли уже, нет?

ypppu пишет:

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

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

40

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

Возможно, у меня проблема в терминологии. Прежде чем экспериментировать, попробую разобраться.
Переменная - это область памяти. Чтобы к ней обратиться, используется ссылка - имя переменной.
Объект - это область памяти. Чтобы к нему обратиться, используется ссылка - указатель (pointer, handle) на объект.
Если не так - поправьте.

41

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

В последней версии решен (наконец-то) вопрос локальности переменных не объявленных явно, то есть раньше надо было объявить v5.

MyFunc(5)

MsgBox % v5

MyFunc(i) {
	Local
	v%i% := 42
}
ypppu пишет:

Переменная - это область памяти. Чтобы к ней обратиться, используется ссылка - имя переменной.

Имя переменной не является уникальным, ведь у локальной и глобальной переменной может быть одно имя.

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

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

42

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

Чем дальше в лес, тем больше дров. Буду пока что избегать неявных переменных в функциях.

43 (изменено: teadrinker, 2017-12-30 22:35:03)

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

serzh82saratov пишет:

В последней версии решен (наконец-то) вопрос локальности переменных не объявленных явно

OFF: Зато в последней версии есть прикольный баг:

i := 0
MsgBox, % ++i

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

44 (изменено: serzh82saratov, 2017-12-30 22:45:53)

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

Так я же вам ответил, что теперь можно и не избегать, нужно просто указать Local.

Просто в вашем случае в них нет необходимости, если немного поменять синтаксис.


MyFunc(5)
FOR k, v in Object[5].Property1
	MsgBox, %k%: %v%
Return

MyFunc(i) {
	Object := {}, Object[i] := {}
	Object[i]["Property1", "sector_1"] := "VALUE 1-1"
	Object[i]["Property1", "sector_2"] := "VALUE 1-2"

	FOR k, v in Object[5].Property1
		MsgBox, %k%: %v%
}

Ну и так как объект в итоге всё равно один, могу только 10-й раз повторить про 13 пост, что упростит запись.


MyFunc(5)
FOR k, v in Object[5].Property1
	MsgBox, %k%: %v%
Return

MyFunc(i) {
	Object := [] 
	Object[i, "Property1", "sector_1"] := "VALUE 1-1"
	Object[i, "Property1", "sector_2"] := "VALUE 1-2"

	FOR k, v in Object[5].Property1
		MsgBox, %k%: %v%
}

И непонятен ваш пример, зачем вообще массив, ещё и с каким-то индексом, если по завершении функции он (массив) исчезнет?

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

45

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

teadrinker
Не понял, у меня как надо - "1".

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

46

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

А какая версия сейчас у тебя установлена?

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

47

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

В подписи.

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

48

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

Странно, у меня на 32 и 64 этот код крашит процесс.

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

49

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

Ты как есть запускал?

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

50 (изменено: serzh82saratov, 2017-12-31 00:15:31)

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

Да, как есть, тоже вылетает.
С #NoEnv норм. Надо в баг репорт.

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

51

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

Уже сообщили, я написал здесь на всякий случай, чтоб было у нас известно.

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

52

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

stealzy пишет:
ypppu пишет:

А объекты всегда глобальны?

Вы же вроде проверяли уже, нет?

Вот проверил. По умолчанию в функции объект локален. Если раскомментировать строку, он будет объявлен глобальным.

MyFunc()
FOR k, v in Object1.Property1
MsgBox, %k%: %v%
Return


MyFunc()
{
;Global Object1
Object1 := {}
Object1["Property1", "sector_1"] := "VALUE 1-1"
Object1["Property1", "sector_2"] := "VALUE 1-2"
FOR k, v in Object1.Property1
MsgBox, %k%: %v%
}

Правда, если посмотреть список Global Variables посреди выполнения функции, будет видно, что существует одноимённая с объектом глобальная переменная Object1.

53

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

Дополнительно исследовал попавшийся баг. Результат такой.
Если внутри функции создать объект, используя в качестве части имени переменную (например Object%i%), то такой объект станет доступен вне функции (то есть глобально). Но! В отличие от объекта, изначально созданного вне функции, к нему будет невозможно обратиться, используя в качестве части имени переменную. Можно только если использовать точное имя.
Пока это писал, заметил исключение. Если где-то в коде вне функции имеется строка, в которой идёт обращение к объекту по точному имени, то появляется возможность использовать переменную как часть имени.
Короче, винегрет полный. Вывод: не используйте баги!

MyFunc(5)

;Так отдельно не работает, но заработает, если раскомментировать след. 2 строки
var := 5
FOR k, v in Object%var%.Property1
MsgBox, 1111111`n--------------`n %k%: %v%
Return


;FOR k, v in Object5.Property1 ;Так работает всегда
;MsgBox, 2222222`n--------------`n %k%: %v%


MyFunc(i)
{
Object%i% := {}
Object%i%["Property1", "sector_1"] := "VALUE 1-1"
Object%i%["Property1", "sector_2"] := "VALUE 1-2"

FOR k, v in Object%i%.Property1
MsgBox, Функция`n--------------`n %k%: %v%
}

54

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

Хочу посоветоваться.
Я собираюсь передавать ссылку на объект в функцию. Насколько мне известно, чтобы функция работала напрямую с глобальной переменной, а не создавался локальный дубликат, используется ByRef. А у меня вместо переменной будет объект.
Я попробовал как с ByRef, так и без ByRef - работает одинаково хорошо.

Object1 := {}
MyFunc(Object1)


MsgBox, % Object1["Property1"]  
MsgBox, % Object1["Property2"]
Return


MyFunc(x)
{
x["Property1"] := 111
x["Property2"] := 222
MsgBox, % "Функция`n" x["Property1"]
MsgBox, % "Функция`n" x["Property2"]
MsgBox, % "Функция`n" Object1["Property1"]
MsgBox, % "Функция`n" Object1["Property2"]
}

Вопрос: это так и задумано и можно обходиться без ByRef? Или это баг?

55 (изменено: stealzy, 2018-01-02 17:47:39)

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

ypppu пишет:

чтобы функция работала напрямую с глобальной переменной

Ваша ф-ия напрямую с содержимым переменной Object1 не работает.
Ф-ия читает содержащуюся в этой переменной ссылку на данные, и меняет уже эти данные.
Если вы ожидали, что ф-ия клонирует переданный ей объект, то это не так; клонируется только переменная, содержащая ссылку на объект.

Object1 := {Property1: 42, Property2: 23}
MyFunc(Object1)
MsgBox % Object1["Property1"] " " Object1["Property2"]
Return

MyFunc(x) { ; ByRef
	x := {Property1: 200, Property2: 300}
}

Вот вам еще для размышлений:

Object1 := {Property1: 42, Property2: 23}
Object2 := Object1, Object2["Property1"] := 3000
MsgBox % Object1["Property1"] " " Object1["Property2"]

Клонировать нужно явно, используя метод Clone.

56

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

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

57 (изменено: ypppu, 2018-01-02 18:49:16)

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

По первому примеру: я не планировал клонировать объект в функцию. В моём примере просто демонстрируется, что и Object1, и x ссылаются на одну и ту же область памяти. Только почему-то x["Property1"] выдаёт 111, а  Object1["Property1"] выдаёт пустую строку.

58 (изменено: stealzy, 2018-01-02 18:54:51)

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

Хз, по ByRef разницу я показал в первом примере.
Переменная определенно имеет уникальное имя; адрес памяти(не факт что уникальный), где начинаются ее данные, и тип данных, чтобы знать на каком адресе данные заканчиваются и как данные интерпретировать. Ну и сами данные, конечно.
Когда вы пишите b:=a выделяется область в памяти (т.е. с символьным обозначением переменной связывается адрес памяти и тип), куда записывается содержимое из a.
Но если а это объект, то выделения памяти не происходит. Вместо этого с символьным обозначением b связывается тот же адрес и тип, которые записаны в a.

ypppu пишет:

почему-то x["Property1"] выдаёт пустую строку, а  Object1["Property1"] выдаёт 111

Вообще-то наоборот, так что не вижу ничего странного. Область видимости Object1 не глобальна.

ypppu пишет:

В моём примере просто демонстрируется, что и Object1 в области видимости главного потока, и x в области видимости ф-ии MyFunc() ссылаются на одну и ту же область памяти.

Лол, сколько можно говорить уже про области видимости? Пора уже новую тему создавать, развели оффтопа тут .

59

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

Вот, теперь допёрло про значимость ByRef в первом примере.

Вообще-то наоборот, так что не вижу ничего странного. Область видимости Object1 не глобальна.

Опечатался, поправил. Однако, утверждение

и Object1, и x ссылаются на одну и ту же область памяти

остаётся в силе:

Local Variables for MyFunc()
--------------------------------------------------
Object1[0 of 0]: 
x: Object object {address: 0x3F31B0}


Global Variables (alphabetical)
--------------------------------------------------
0[1 of 3]: 0
ErrorLevel[1 of 3]: 0
link: Object object {address: 0x3F31B0}
Object1: Object object {address: 0x3F31B0}

60

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

Наверное это плохо, потому как сбивает с толку. Я вижу в окошке «Variables and their contents», что локальный объект x хранит свои данные по тому же адресу, что и глобальных объект Object1. Я прихожу к выводу, что это один и тот же объект. Но изнутри функции добраться до глобального не удаётся. Возникает когнитивный диссонанс.

61

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

Хочу проверить себя.

Эта функция пытается работать напрямую с содержимым Object1. Но это возможно только при наличии ByRef.

Object1 := {Property1: 42, Property2: 23}
MyFunc(Object1)

MsgBox % Object1["Property1"] " " Object1["Property2"]
Return


MyFunc(x) { ; ByRef
	x := {Property1: 200, Property2: 300}
}

А это называется "Функция читает ссылку на данные и меняет эти данные". ByRef не требуется.

Object1 := {Property1: 42, Property2: 23}
MyFunc(Object1)

MsgBox, % Object1["Property1"] " " Object1["Property2"]
Return


MyFunc(x) {
x["Property1"] := 200, x["Property2"] := 300
}

Всё верно? И тут, и там объект. Разница только в синтаксисе? http://smayli.ru/data/smiles/dumy-145.gif

62

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

ypppu пишет:

Эта функция пытается работать напрямую с содержимым Object1. Но это возможно только при наличии ByRef.

confused_jackie_chan.jpg
Эта ф-ия меняет ссылку переменной объекта на созданный внутри ф-ии объект.
Без ByRef изменяется не оригинальная переменная, а ее локальный дубликат, который очищается на выходе из ф-ии.
С ByRef изменяется ссылка оригинальной переменной, она указывает на новые данные. Старые данные, как не имеющие ссылок на себя, очищаются сборщиком мусора.

Во втором примере ссылка вообще не меняется в ф-ии, поэтому ByRef или нет - побоку. Если вы обращаетесь к данным по ссылке, вы получаете их. Локальность переменных связанных с этой ссылкой не имеет никакого значения.

63

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

В первом случае при вызове функции без ByRef переданная ссылка затирается путём создания одноимённого локального объекта.
В первом случае при вызове функции с ByRef переданная ссылка становится указателем на глобальный объект. Функция редактирует его содержимое.
http://smayli.ru/data/smiles/dumy-5.gif
А во втором случае производятся действия с уже существующим объектом, ничего нового не создаётся. Поэтому ни Global, ни ByRef не требуется.

64 (изменено: stealzy, 2018-01-04 13:13:28)

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

Придумалась одна аналогия.
Обычно переменные описывают как коробки и их содержимое, или как обложка книги и ее содержимое. Это упрощенная аналогия неполна, когда дело доходит до передачи значений по ссылкам.
А библиотечный каталог вполне подойдет. Каталог это журнал, в котором есть разделы, в которых записаны названия всех книг, а напротив них — расположение книги в библиотеке. В отличии от реальной библиотеки уникальна будет только комбинация раздела и названия книги (в одном разделе не может быть двух книг с одинаковым названием), местонахождение разных книг (разные названия) может быть одинаковым (и содержимое очевидно тоже), содержимое книг с разным расположением может быть одинаковым.
Теперь самое интересное — объект это не простая книга, это книга-каталог, где указаны расположения других книг в библиотеке, которые тоже могут быть каталогами.

; В журнале создается раздел MainThread и в нем создается новая запись:
Object1 := {Property1: 42, Property2: 23}
; книга Object1 находится в 7 стеллаже на 4 полке. Содержимое книги: каталог с расположением книг Property1 и Property2.
MyFunc(Object1)
; книга Object1 находится в 7 стеллаже на 4 полке. Содержимое книги: каталог с расположением книг Property1 и Property2.
MsgBox % Object1["Property1"] " " Object1["Property2"]

MyFunc(x) {
	; В журнале создается раздел MyFunc и в нем создается новая запись, адрес у нее другой, а содержимое копируется из Object1:
	; книга x находится в 9 стеллаже на 2 полке. Содержимое книги: каталог с расположением книг Property1 и Property2 скопирован из Object1.
	x := {Property1: 200, Property2: 300}
	; книга x находится в 9 стеллаже на 2 полке. Содержимое книги: каталог с новым расположением книг Property1 и Property2 (и новым содержимым).
	; На выходе из ф-ии раздел MyFunc со всеми записями очищается.
}

; В журнале создается раздел MainThread и в нем создается новая запись:
Object1 := {Property1: 42, Property2: 23}
; книга Object1 находится в 7 стеллаже на 4 полке. Каталог с расположением книг Property1 и Property2.
MyFunc(Object1)
; книга Object1 находится в 7 стеллаже на 4 полке. Каталог с новым расположением книг Property1 и Property2 (и новым содержимым).
MsgBox % Object1["Property1"] " " Object1["Property2"]

MyFunc(ByRef x) {
	; В журнале в разделе MainThread меняется запись, у книги тот же адрес, что и у Object1 (содержание уж само собой):
	; книга x находится в 7 стеллаже на 4 полке. Каталог с расположением книг Property1 и Property2.
	x := {Property1: 200, Property2: 300}
	; книга x находится в 7 стеллаже на 4 полке. Каталог с новым расположением книг Property1 и Property2 (и новым содержимым).
}
Object1 := {Property1: 42, Property2: 23}
MyFunc(Object1)
MsgBox % Object1["Property1"] " " Object1["Property2"]

MyFunc(x) {
	; Книга x находится в 9 стеллаже на 2 полке. Каталог с расположением книг Property1 и Property2 скопирован из книги Object1.
	; Если использован ByRef каталог будет оригинальным, но нам побоку, потому что мы не меняем сам каталог.
	x["Property1"] := 200, x["Property2"] := 300
	; Берем книги по расположению в записях Property1 и Property2, и заменяем на другие книги. Сами каталог (записи в нем) не трогаем.
}

Резюмируя: чтобы работать с книгами из католога, вам достаточно ксерокопии каталога. Вы можете читать и изменять книги (содержимое переменных) или даже выкинуть их, но в каталоге все рано останется запись на то место, где были эти книги.
А изменить сам каталог(названия книг и их расположения) меняя ксерокопию не выйдет.

65

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

Глянул справку и стала ясна терминология autohotkey:
переменные в области видимости главного потока — глобльные,
переменные видимые во всех областях видимости — супер-глобальные. Оказывается это относительно новая фича (всего-то семь лет ), поэтому окошко «Variables and their contents» пока просто не научили показывать их отдельно.

Global superGlobal := 100
mainThread := 1
f()
MsgBox % "MainThread:`nmainThread = " mainThread "`n> mainThread2 = " mainThread2 "`nsuperGlobal = " superGlobal
j()
Return

f() {
	Global mainThread, mainThread2 := 7
	MsgBox % "f():`n> mainThread = " mainThread "`nmainThread2 = " mainThread2 "`nsuperGlobal = " superGlobal
}
j() {
	MsgBox % "j():`n> mainThread = " mainThread "`n> mainThread2 = " mainThread2 "`nsuperGlobal = " superGlobal
}

66

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

stealzy пишет:

окошко «Variables and their contents» пока просто не научили показывать их отдельно

А зачем?

67

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

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

68

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

Переменные там разделены по областям видимости в функциях.
По-моему всё наглядно:

ListVars
Global superGlobal := 100
f1()
f2()
return

f1()
{
   local superGlobal
   MsgBox, % superGlobal  ; локальная
}

f2()
{
   MsgBox, % superGlobal   ; глобальная
}

69

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

Подождите, я ещё в библиотеке сижу! Есть пара вопросов по переменным.

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

Post's attachments

Схема библиотеки.PNG 17.69 kb, file has never been downloaded. 

You don't have the permssions to download the attachments of this post.

70

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

Malcev, тогда беру свои слова назад.
Супер-глобальные равнозначны глобальным, объявленным внутри ф-ии словом global, выделять их отдельно не нужно.

ypppu пишет:

Однако, утверждение

    и Object1, и x ссылаются на одну и ту же область памяти

остаётся в силе:

    Local Variables for MyFunc()
    --------------------------------------------------
    Object1[0 of 0]:
    x: Object object {address: 0x3F31B0}

    Global Variables (alphabetical)
    --------------------------------------------------
    0[1 of 3]: 0
    ErrorLevel[1 of 3]: 0
    link: Object object {address: 0x3F31B0}
    Object1: Object object {address: 0x3F31B0}

Поскольку Object1 не был объявлен супер-глобальным вне ф-ии или глобальным внутри ф-ии,
ф-ия про него не знает, при упоминании создается локальная пустая переменная Object1. Поэтому внутри ф-ии Object1 никуда не указывает и

ypppu пишет:

Object1["Property1"] выдаёт пустую строку

71 (изменено: stealzy, 2018-01-04 20:29:34)

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

ypppu
Вроде верна.
В моей аналогии раздел это область видимости (глобальная; текущая локальная; статические на каждую ф-ию, которые становятся локальными при входе в их ф-ию), но можно заменить разделы на корневой каталог, в котором книги - это области видимости. Не уверен, что у них есть имена, если бы имена были, к переменным внутри можно было бы адресно обратиться как к переменным массива (array.x), а это невозможно (получить доступ к глобальным изнутри ф-ии, если они не объявлены global, или получить доступ к статическим извне ф-ии).
Нет в разделе только записи о них.
Да.
Да, но названия хранятся только в журнале, на самих книгах ничего не написано (обложки нет).

72

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

Перерисовал табличку.
В одной области видимости (то есть в пределах одного раздела) не может быть переменных с одинаковым именем.
Не может быть несколько областей видимости (разделов) с одинаковым названием.
В разных областях видимости могут быть одноимённые переменные.
Разные переменные могут ссылаться на один и тот же адрес памяти.
По одному и тому же адресу памяти не может быть разное содержимое.

Post's attachments

Переменные.PNG 13.34 kb, file has never been downloaded. 

You don't have the permssions to download the attachments of this post.

73 (изменено: stealzy, 2018-01-04 22:16:54)

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

Ну, у ф-ии не может быть своей переменной а (записи в журнале с другим адресом), если а объявлена:
супер-глобальной (global a вне ф-ий)
или глобальной (global a внутри этой ф-ии)
или вся область видимости ф-ии объявлена глобальной (global), причем переменная а не находится под local.

И ситуация как на картинке существует только если исполнение находится внутри обеих ф-ий одновременно, например Func1() вызвала Func2(). Если исполнение вне какой-либо ф-ии, тогда существуют только статические переменые этой ф-ии.

74

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

Спасибо, вроде пока всё понятно с переменными. Позже займусь объектами.

75

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

stealzy пишет:

Теперь самое интересное — объект это не простая книга, это книга-каталог, где указаны расположения других книг в библиотеке, которые тоже могут быть каталогами.

Значит переменная ("книга") - это просто данные (Integer, float или string), а объект - это каталог, содержащий ссылки на какие-то другие данные. Тут возникает вопрос: эти другие данные являются частью объекта? Или объект сам по себе, данные - сами по себе?

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

Пост с примерами
В первом примере делается полная копия (и каталожная часть, и данные) объекта из глобальной области в область видимости функции.

1.1. Без ByRef. Любые манипуляции внутри функции повлияют только на копию объекта внутри функции. В этом случае адреса данных, принадлежащих локальному объекту (объекту внутри функции)  отличаются от адресов данных объекта-оригинала (объекта в глобальной видимости).

1.2 С ByRef. То же самое что и 1.1, но по завершению работы функции глобальных объект изменится - станет копией локального объекта со всеми изменениями, произведёнными в ходе работы функции.

Как в примере 1.1, так и в 1.2 используется "локальная ксерокопия" объекта.


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

76 (изменено: stealzy, 2018-01-10 19:36:24)

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

ypppu пишет:

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

1.1. Без ByRef. Любые манипуляции внутри функции повлияют только на копию объекта внутри функции. В этом случае адреса данных, принадлежащих локальному объекту (объекту внутри функции)  отличаются от адресов данных объекта-оригинала (объекта в глобальной видимости).

1.2 С ByRef. То же самое что и 1.1, но по завершению работы функции глобальных объект изменится - станет копией локального объекта со всеми изменениями, произведёнными в ходе работы функции.

Как в примере 1.1, так и в 1.2 используется "локальная ксерокопия" объекта.

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

"Сильное заявление. Проверять я его, конечно, не буду"®

77 (изменено: stealzy, 2018-01-10 02:40:43)

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

Каталог - это просто книга имеющая тип "каталог".
Каталог хранит только имена и расположения других книг в библиотеке. Никто не запрещает ссылаться на существующее место в библиотеке из другого каталога или главного журнала.
Другими словами
Можно рассматривать объект как переменную особого типа, причем данные дочерних переменных она внутри себя не хранит.
Но обычно под объектом подразумевают и саму переменную объекта и данные дочерних переменных, на которые она ссылается.
Ф-ии работают с переменной объекта, также как и с другими типами переменных. Отсюда очевидно, что полная копия (объекта в привычном понимании) при передаче переменной объекта в ф-ию не создается.

78

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

В цитате что означает выделение красным и оранжевым?

79

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

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

80

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

Это не утверждения, это рассуждения в попытке разобраться.

Object1 := {Property1: 42, Property2: 23}
ListVars
ToolTip % "Object1 `n" Object1["Property1"] " " Object1["Property2"]
Sleep, 2000
MyFunc(Object1)

ToolTip % "Object1 `n" Object1["Property1"] " " Object1["Property2"]
ListVars
Return


MyFunc(x)
{
ToolTip % "x `n" x["Property1"] " " x["Property2"]
ListVars
Sleep, 2000
x := {Property1: 200, Property2: 300}
ToolTip % "x `n" x["Property1"] " " x["Property2"]
ListVars
Sleep, 2000
}

1.1 Если без ByRef, то в локальный объект x попадают адреса Object1. Это говорит о том, что переданная "ксерокопия" ссылается на те же "полки", что и оригинал. При выполнении x := {Property1: 200, Property2: 300} адреса ("полки") для локального объекта x изменяются. По завершению работы функции видим, что в глобальном Object1 изменений не произошло.

1.2 С ByRef в глобальном Object1 изменения происходят. Только просмотреть ListVars не получается - программа вылетает с ошибкой. Но если ListVars закомментировать, то по ToolTip видно, что Object1 после работы функции изменился. Из чего я делаю вывод, что с ByRef локальный объект x ссылается на то же содержимое памяти, что и Object1.

Какие выводы...
Я был неправ насчёт полной копии; при вызове функции копируется только каталожная часть объекта (она же ссылка, она же переменная, она же указатель (pointer)  или "обращение (handle)").
В п. 1.1 нет копии объекта, есть только копия его каталожной части. Поскольку в широком смысле объект = каталожная часть + данные.

В п. 1.2  глобальных объект изменится при выполнении x := {Property1: 200, Property2: 300}, а не по завершению работы функции.

Что я сказал не так про локальные ксерокопии?

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

+ открыть спойлер
Object1 := {Property1: 42, Property2: 23}
ListVars
ToolTip % "Object1 `n" Object1["Property1"] " " Object1["Property2"]
Sleep, 2000
MyFunc(Object1)

ToolTip % "Object1 `n" Object1["Property1"] " " Object1["Property2"]
ListVars
Return


MyFunc(x) {
ToolTip % "x `n" x["Property1"] " " x["Property2"]
ListVars
Sleep, 2000
x["Property1"] := 200, x["Property2"] := 300
ToolTip % "x `n" x["Property1"] " " x["Property2"]
ListVars
Sleep, 2000
}

81

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

В п. 1.2 вообще никаких "ксерокопий" не создается.
Во втором примере внутри ф-ии не оригинальный каталог, а "ксерокопия" оригинального каталога. В коде под спойлером внутри ф-ии вы не пытаетесь изменить оригинальный каталог, а меняете книги, на которые ссылается ксерокопия.
Возможно я просто неправильно истолковал эти высказывания, легко запутаться в терминологии.

82 (изменено: svoboden, 2018-01-11 06:50:35)

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

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

83

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

svoboden, на данный момент я разбираюсь как работать с объектом внутри функции.

stealzy, то есть:

  • при передаче объекта в функцию без ByRef внутри функции создаётся копия оригинала;

  • при передаче объекта в функцию c ByRef внутрь функции попадает оригинал;

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

Всё так?

84

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

Ещё такой момент хочу уточнить.

stealzy пишет:

#68 Резюмируя: чтобы работать с книгами из католога, вам достаточно ксерокопии каталога. Вы можете читать и изменять книги (содержимое переменных) или даже выкинуть их, но в каталоге все рано останется запись на то место, где были эти книги.
А изменить сам каталог(названия книг и их расположения) меняя ксерокопию не выйдет.

Вот пример, где я использую ксерокопию каталога:

+ открыть спойлер
Object1 := {Property1: 42, Property2: 23}
ListVars
ToolTip % "Object1 `n" Object1["Property1"] " " Object1["Property2"]
Sleep, 2000
MyFunc(Object1)

ToolTip % "Object1 `n" Object1["Property1"] " " Object1["Property2"] " " Object1["Property3"]
ListVars
Return


MyFunc(x) {
ToolTip % "x `n" x["Property1"] " " x["Property2"]
ListVars
Sleep, 2000
x["Property1"] := 200, x["Property2"] := 300, x["Property3"] := 600
ToolTip % "x `n" x["Property1"] " " x["Property2"] " " x["Property3"]
ListVars
Sleep, 2000
}

То есть я работал с ксерокопией каталога, в котором изначально было две книги: Property1 и Property2. Я добавил в каталог ещё одну книгу под названием Property3. В итоге считается что я изменил каталог, меняя ксерокопию? Или добавление книг за изменение каталога не считается? Или же это баг?

85 (изменено: stealzy, 2018-01-11 18:18:13)

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

Интересно! Значит я ошибался и объект устроен иначе — переменная объекта только хранит ссылку на "каталог":

o := [1, 2]
f(o)
MsgBox % o[1]

f(x) {
	; x := [4, 5]
	x.RemoveAt(1)
}

Только эта ссылка и копируется в ф-ии.

86

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

Таки можно изменять глобальный объект, не вылезая из функции и не прибегая к ByRef!

87

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

Почему глобальный, любой.


f2()

f(x) { 
	x.RemoveAt(1)
}
f2() {
	o := [1, 2] 
	MsgBox % o[1]
	f(o)
	MsgBox % o[1]
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

88

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

Без ByRef нельзя изменить внешний объект изнутри ф-ии присваивая переменной (объекта) другое значение (другой объект). Но можно редактировать переданный объект и его элементы.

89

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

нельзя изменить внешний объект

На примере можно, что именно нельзя.

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

90

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

Дочитал, не вник, предложил привести пример. Если бы вник, то (оказалось не для всех это очевидно) пример бы не спрашивал.

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

91

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

Наверное имеется в виду

Без ByRef нельзя изменить внешний объект изнутри ф-ии таким способом как   x := {Property1: 200, Property2: 300}

92

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

Приводить такой код, не так приятно для самолюбия как, не дочитали не вникли.


f2()

f(x) {  
	x := {Property1: 222}
	 ; x.Property1 := 222 
	
}
f2() {
	o := {Property1: 111}
	MsgBox % o.Property1
	f(o)
	MsgBox % o.Property1
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

93

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

Ок.

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

94 (изменено: stealzy, 2018-01-12 13:52:51)

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

Обсуждение объектов и указателей:
https://autohotkey.com/boards/viewtopic.php?t=316

lexikos пишет:

obj is also not the name of an object; it is the name of a variable containing [a reference to] an object.

— объекты не имеют имен.
https://autohotkey.com/boards/viewtopic.php?t=5868
https://autohotkey.com/boards/viewtopic.php?t=6916

Новейшая документация по теме:
https://autohotkey.com/docs/Concepts.htm#objects

95

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

serzh82saratov, но Ваш пример  не доказывает, что можно

без ByRef изменить внешний объект изнутри ф-ии присваивая переменной (объекта) другое значение (другой объект)

И до f(x), и после f(x) значение o.Property1 равно 111.
o.Property1 изменится на 222, если раскомментировать  «; x.Property1 := 222». Но ведь это уже не есть присваивание переменной объекта другого значения (другого объекта), не так ли?

96

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

Вопрос о порядке чередования данных в объекте.

Я помещаю пары "ключ-значение" в объект в нужном мне порядке. При использовании цикла FOR-loop данные извлекаются в алфавитном порядке.
А хотелось бы, чтобы данные извлекались в том же порядке, в котором я их помещал в объект. Как это лучше осуществить? Может имеется стандартный способ?

MyObject := {}
MyObject := {p1: 1, p2: 2, p10: 10}

FOR k in MyObject
MsgBox, %k%

97

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

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

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

98

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

У массива нет такого свойства как порядок.
Когда вы присваиваете в коде "обычный" массив, расположение элементов играет роль только потому, что ключами элементов автоматически назначаются числа в соответсвии с расположением элементов в записи массива.

MyObject := [{p1: 1}, {p2: 2}, {p10: 10}]

FOR k in MyObject
	FOR k, v in MyObject[k]
		MsgBox % k ": " v

99

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

Правильно, только лучше так:

MyObject := [{p1: 1}, {p2: 2}, {p10: 10}]

for k, v in MyObject
   for k, v in v
      MsgBox % k ": " v
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

100

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

Вчера была идея, но что-то не продумал и поспешил отказываться от неё. Сейчас проверил - работает:

MyObject := {}
MyObject := {p01: 1, p02: 2, p10: 10}

FOR k in MyObject
MsgBox, %k%

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


OFF: не очень разобрался в функции Format(). Проверьте,  так правильно?

var := 3
var := noliki(var)
MsgBox, % var

noliki(input) ;функция добавляет нули (чтобы стояло 4 знака перед запятой) и букву "p"
{
output := "p"
output .= Format("{1:.4i}", input)
Return, output
}