1

Тема: AHK: array.base

Давненько нашел на просторах интернета, библиотеку, которая переносит JS функции в AHK. Там что-то подобное..

Array(prms*)
{
	prms.base := _Array
	return prms
}

class _Array
{
	slice(start:=0, end:=0)
	{

		len := this.Length()

		; START: Adjust 1 based index, check signage, set defaults
		if (start > 0)
			begin := start - 1	; Include starting index going forward
		else if (start < 0)
			begin := len + start  ; Count backwards from end
		else
			begin := start


		; END: Check signage and set defaults
		; MDN States: "to end (end not included)" so subtract one from end
		if (end > 0)
			last := end - 1
		else if (end < 0)
			last := len + end + 1 ; Count backwards from end
		else
			last := len


		results := []

		loop, % last - begin
			results.push(this[begin + A_Index])

		return results
	}
}

Вроде все работает, если сделать допустим так:

arr := [1, 2, 3, 4, 5, 6]
newArr := arr.slice(3) // [3, 4, 5, 6]

Но это не работает вот так:

arr := StrSplit("1 2 3 4 5 6", " ")
newArr := arr.slice(3) // []

К тому же это все нельзя было применить к Object.

Win10: LTSC (21H2); AHK: ANSI (v1.1.36.02)

2 (изменено: teadrinker, 2021-02-09 18:28:16)

Re: AHK: array.base

Думаю, что переопределять все объекты в скрипте не очень хорошая идея. Представьте, что вы используете несколько библиотек, где каждый автор переопределяет их на свой лад. Или наоборот, вы можете своим переопределением испортить работу объектов, авторы которых не рассчитывали на подобное.
Лучше изменять, если нужно, конкретные объекты:

arr := StrSplit("1 2 3 4 5 6", " ")
arr.base := _Array
newArr := arr.slice(3)

for k, v in newArr
   str .= (k = 1 ? "" : ", ") . v
MsgBox, % str

class _Array
{
   slice(start:=0, end:=0)
   {

      len := this.Length()

      ; START: Adjust 1 based index, check signage, set defaults
      if (start > 0)
         begin := start - 1   ; Include starting index going forward
      else if (start < 0)
         begin := len + start  ; Count backwards from end
      else
         begin := start


      ; END: Check signage and set defaults
      ; MDN States: "to end (end not included)" so subtract one from end
      if (end > 0)
         last := end - 1
      else if (end < 0)
         last := len + end + 1 ; Count backwards from end
      else
         last := len


      results := []

      loop, % last - begin
         results.push(this[begin + A_Index])

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

3

Re: AHK: array.base

А если допустим я буду использовать только ее, как ее "починить"? Метод выше не очень устраивает.

Win10: LTSC (21H2); AHK: ANSI (v1.1.36.02)

4

Re: AHK: array.base

Не знаю, наверно никак.

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