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

88

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

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

89

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

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

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

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

90

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

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

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

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

93

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

Ок.

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

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

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

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
}