Что нового

Ассоциативные массивы нативно в AutoIT 3.3.9.6+

inververs

AutoIT Гуру
Сообщения
2 135
Репутация
464
Продолжая эту тему выяснил, что в AutoIT наконец-то появились ассоциативные массивы.

Такой тип обозначен как Table. И вот как этим пользоваться:

Код:
Local $adata[]
$aData['u_name'] = "Мое имя"
$aData['c_name'] = "Мой компьютер"
ConsoleWrite('Вас завут: ' & $aData['u_name'] & ' Ваш компьютер: ' & $aData['c_name'] & @LF) ;Вас завут: Мое имя Ваш компьютер: Мой компьютер



Добавлено:
Сообщение автоматически объединено:

Смешанные массивы еще не доконца сделаны и этот код работает не так как нужно:
Код:
Local $adata[]
$aData['u_name'] = "Мое имя"
$aData[5] = 'Пятый'
$aData['c_name'] = "Мой компьютер"
For $v in $aData
	ConsoleWrite($v & @LF)
Next

Выводит в консоль:
Код:
Мое имя




Пятый
Мой компьютер
Здесь данные затираются
Код:
Local $adata[]
$aData['test'] = '235'
$aData['name'] = 'Имя'
$aData[0] = 'Ноль'
$aData[1] = 'Один'
For $a In $adata
	ConsoleWrite($a & @LF)
Next

Выводит в консоль:
Код:
Ноль
Один


Добавлено:
Сообщение автоматически объединено:

Можно составлять такое:
Код:
Local $adata[]
$aData[1] = 'Один'
$aData[2] = 'Два'
$aData['Сто'] = 'Сто'
$aData[100] = '100'

ConsoleWrite($aData[1] & @LF)
ConsoleWrite($aData[2] & @LF)
ConsoleWrite($aData[100] & @LF)
ConsoleWrite($aData['Сто'] & @LF)


Двумерные массивы так не создаются. Пока можно сэмулировать так:

Код:
Local $ub1[],$ub2[]
$ub1['name'] = $ub2
$ub1['name']['one'] = 'Январь'
$ub1['name']['two'] = 'Февраль'
ConsoleWrite($ub1['name']['one'] & @LF)
ConsoleWrite($ub1['name']['two'] & @LF)

;ИЛИ
For $v in $ub1
	For $w in $v
		ConsoleWrite($w & @LF)
	Next
Next

;ИЛИ
ConsoleWrite($ub1.name.one & @LF)
ConsoleWrite($ub1.name.two & @LF)

Ps. Данный функционал официально не объявлен.
Работает в бета версии 3.3.9.21
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
Re: Ассоциативные массивы нативно в AutoIT

inververs
Эта темка интересней чем предыдущая :smile:
inververs сказал(а):
Смешанные массивы еще не доконца сделаны и этот код работает не так как нужно
Вы заключите пятерочку в индексе в апотострофы, и будет как все=)
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2 135
Репутация
464
Re: Ассоциативные массивы нативно в AutoIT 3.3.9.11+

MnM [?]
Вы заключите пятерочку в индексе в апотострофы, и будет как все=)
не в этом дело)

Вот еще, к элементам такого массива можно обращаться через свойство, по имени
Код:
Local $adata[]
$aData['test'] = '235'
ConsoleWrite($aData.test & @LF)
 

firex

AutoIT Гуру
Сообщения
943
Репутация
205
Re: Ассоциативные массивы нативно в AutoIT 3.3.9.11+

inververs
Что то на подобии:

Код:
$aData['test1']['test2']['test3']

Возможно?
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2 135
Репутация
464
Re: Ассоциативные массивы нативно в AutoIT 3.3.9.11+

firex
Нет, как я понял - только одномерный массив. Или сурагат, смотри первое сообщение.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Пока, ИМХО, Scripting.Dictionary функциональнее, увы... :(
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 473
Репутация
2 403
inververs [?]
Смешанные массивы еще не доконца сделаны и этот код работает не так как нужно
Всё очень даже логично.
$aData[5] указывает на число элементов, т.е тут просто увеличивается размерность массива.
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2 135
Репутация
464
CreatoR
Немного не так вначале выразился. Я поправил первое сообщение. Показал, что смешанные массивы не работают. Данные затирают друг друга на одинаковых "индексах".


Добавлено:
Сообщение автоматически объединено:

Хотя если поместить сперва индексы, то все ок
Код:
Local $adata[]
$aData[0] = 'Ноль'
$aData[1] = 'Один'
$aData['test'] = '235'
$aData['name'] = 'Имя'
For $a In $adata
	ConsoleWrite($a & @LF)
Next

Код:
Ноль
Один
235
Имя
 

AZJIO

Меценат
Меценат
Сообщения
2 752
Репутация
1 149
inververs
А не приходила мысль, что доступ возможен по индексам? Ассоциативный массив содержит определенное число элементов, а значит их просто можно посчитать и обратиться по индексу.
Последний пример выше вполне может создать 2 ячейки, а после них добавить ещё 2. Возможно первые автоматически получили имена согласно индексам.
 
Сообщения
119
Репутация
-6
Код:
$aData['name'] = 'Vova'
$aData['surname'] = 'Putin'
$aAge['name'][67] = 'real'
$aAge['name'][28] = 'married'

Выводит только элемент 0. То есть массив перезаписывается и остается только последнее.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 473
Репутация
2 403
ЭйчЭйч [?]
Выводит только элемент 0. То есть массив перезаписывается и остается только последнее
Это не работает в 3.3.14.0, только в бетах 3.3.9.6+.
Видимо разработчики решили отказаться от этого.
 
Верх