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
OS: Win7x64, AutoHotkey_L v1.1.27.03 (Unicode 32-bit).

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
Skype dmitry_fiveg

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
OS: Win7x64, AutoHotkey_L v1.1.27.03 (Unicode 32-bit).

45

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

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

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

46

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

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

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

47

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

В подписи.

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

48

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

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

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

49

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

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

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

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

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

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

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