1 (изменено: kolotilov256, 2020-03-24 21:09:09)

Тема: AHK: Объекты в аргументе функций

Здравствуйте. Произошёл троллинг. Или чертовщина. Называйте как хотите.
Просьба объяснить, какого лешего творит автохоткей и как передать объект в функцию, без последствий его изменения...

Есть вот у нас код.
Переменная obj не является глобальной.
В функции func нет никаких ByRef.

obj := []
obj.abc := 5
msgbox % obj.abc
func(obj)
msgbox % obj.abc

func(obj)
{
	obj.abc := 6
}

Вопрос какого-ж чёрта изменяется объект? Ладно подумал я, может быть это такое уникальное свойство объекта (о котором я не слышал ни одного упоминания)

Немного изменил код.

1) Сделал аргумент функции отличным от объекта (ну на всякий случай)
2) Сделал копию объекта, который передаётся в функцию.
3) Сделал функцию вроде как локальной

obj := []
obj.abc := 5
msgbox % obj.abc
temp_obj := obj
func(temp_obj)
msgbox % obj.abc

func(var)
{
	local
	var.abc := 6
}

И это не помогло! Результат не изменился. Исходный объект всё равно изменяется -_-

2

Re: AHK: Объекты в аргументе функций

Читайте здесь.

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

3

Re: AHK: Объекты в аргументе функций

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

func(var)
{
	var := new var
	var.abc := 6
}

4

Re: AHK: Объекты в аргументе функций

Смотря, что в объекте.
В любом случае можно воспользоваться методом Clone. Если это массив, можно так:

arr := [1, 2, 3]
MyFunc(arr*)
MsgBox, % arr[1]

MyFunc(params*) {
   MsgBox, % params[1]
   params[1] := "test"
   MsgBox, % params[1]
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5

Re: AHK: Объекты в аргументе функций

kolotilov256 пишет:

Да уж, как же это не очевидно.

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

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

6 (изменено: kolotilov256, 2020-03-24 19:15:25)

Re: AHK: Объекты в аргументе функций

А есть какое-то различие между
obj := new obj
и obj := obj.Clone() ?

7

Re: AHK: Объекты в аргументе функций

Когда используете Clone() — это будет новый объект (хотя, если элементы объекта тоже объекты, они останутся старыми, их нужно отдельно клонировать). Когда используете new — это новый экземпляр старого объекта, он будет зависим от старого:

arr1 := [1, 2, 3]
arr2 := new arr1
MsgBox, % arr2[1]
arr1[1] := "test"
MsgBox, % arr2[1]
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder