1

Тема: AHK: Метод класса __Set()

Всем добра!

В справке сказано, что он вызывается для всякого атрибута, имя которого не было найдено при попытке присвоить ему значение. Но ведь на момент создания класса, конструктор __New() как раз занимается тем, что присваивает несуществующим атрибутам новые значения, а раз так, то следующий пример превращается в бесконечную рекурсию:

class Test
{
	__New(data_01, data_02) {
		this.data_01 := data_01
		this.data_02 := data_02
		this.storage := {}
	}
	
	__Get(key) {
		return this.storage[key]
	}
	
	__Set(key, value) {
		this.storage[key] := value
	}
}

obj := new Test("data_01", "data_02")

MsgBox,% obj.data_01
MsgBox,% obj.data_02

obj.data_03 := "test"
MsgBox,% obj.data_03

Подскажите пожалуйста, как правильно записать пример выше, чтобы создание атрибутов из __New() не превращалось в рекурсию.

2

Re: AHK: Метод класса __Set()

	__Set(key, value) {
		If (key != "storage")
			this.storage[key] := value
	}

3

Re: AHK: Метод класса __Set()

Но при этом значение не только помещается в "storage", но ещё и дублируется в атрибуте "obj". Соответственно, __Get(), при этом не вызывается, когда происходит обращение в "MsgBox,% obj.data_03".

class Test
{
	__New(data_01, data_02) {
		this.data_01 := data_01
		this.data_02 := data_02
		this.storage := {}
	}
	
	__Get(key) {
		MsgBox, Call Get()
		return this.storage[key]
	}
	
	__Set(key, value) {
		If (key != "storage")
			this.storage[key] := value
	}
}

obj := new Test("data_01", "data_02")

MsgBox,% obj.data_01
MsgBox,% obj.data_02

obj["data_03"] := "test"
MsgBox,% obj.data_03

for k, v in obj
	MsgBox,% "from obj => " k " = " v

for k, v in obj.storage
	MsgBox,% "from obj.storage => " k " = " v

4

Re: AHK: Метод класса __Set()

Правильно так:

class Test
{
   __New(data_01, data_02) {
      this.data_01 := data_01
      this.data_02 := data_02
      this.storage := {}
   }
   
   __Get(key) {
      return this.storage[key]
   }
   
   __Set(key, value) {
      if !(key ~= "i)^(data_(01|02)|storage)$") {
         this.storage[key] := value
         Return value
      }
   }
}

obj := new Test("data_01", "data_02")

MsgBox,% obj.data_01
MsgBox,% obj.data_02

obj.data_03 := "test"
MsgBox,% obj.data_03
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder