Что нового

Объект Scripting.Dictionary произвольно создает ключ

joiner

Модератор
Локальный модератор
Сообщения
3 254
Репутация
552
Пример
Код:
#include <Array.au3>
Local $oDict = ObjCreate('Scripting.Dictionary')
$oDict.CompareMode = 1
Local $vKey = 0
Local $vValue = $oDict.Item($vKey) ; читаем не существующий ключ
Local $Array = $oDict.Keys()
_ArrayDisplay($Array)

Если убрать чтение значения, то ключей нет
Это баг или особенность? не нашел пояснений
 

Cytrus

Новичок
Сообщения
102
Репутация
3
Таким выражением вы добавляете ключ в коллекцию, если он отсутствует.
 
Автор
joiner

joiner

Модератор
Локальный модератор
Сообщения
3 254
Репутация
552
Разве?
Item
Устанавливает или читает новое значение указанного ключа. Значение может быть типом данных: строка, числа целое и с плавающей точкой, логическое значение, бинарные данные.

$oDict.Item($vKey) = $vNewValue ; устанавливает значение или добавляет если не существует
$vValue = $oDict.Item($vKey) ; читает значение
 

Cytrus

Новичок
Сообщения
102
Репутация
3
Ну да.

Так добавляется ключ, если он отсутствует.

Код:
#include <Array.au3>
Local $oDict = ObjCreate('Scripting.Dictionary'),$Array,$v
$oDict.Item(333)
$Array = $oDict.Keys()
_ArrayDisplay($Array, "111")
$v=$oDict.Item(444)
$Array = $oDict.Keys()
_ArrayDisplay($Array, "222")
$oDict.Item(555)
$Array = $oDict.Keys()
_ArrayDisplay($Array, "333")
$v=777
$oDict.Key(555) = $v
$Array = $oDict.Keys()
_ArrayDisplay($Array, "444")
 
Автор
joiner

joiner

Модератор
Локальный модератор
Сообщения
3 254
Репутация
552
Cytrus [?]
Так добавляется ключ, если он отсутствует.
это я уже понял, экспериментальным образом. когда ловил плавающий баг в своем коде
нашел в справке майкрософта
Если ключ не найден при изменении элемента, с указанным _newitem_создается новый ключ . Если ключ не найден, при попытке возврата существующего элемента, создается новый ключ и его соответствующего элемента оставить пустым.
Отсюда
в нашей справке
нет этого. просьба к тому, кто имеет доступ, дополнить описание в русской справке
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 444
Репутация
2 393
А если так:

Код:
#include <Array.au3>

Local $oDict = ObjCreate('Scripting.Dictionary')
$oDict.CompareMode = 1
Local $vKey = 0
Local $vValue = _GetKey($oDict, $vKey) ; читаем не существующий ключ

Local $Array = $oDict.Keys()
_ArrayDisplay($Array)

Func _GetKey($oDict, $sKey)
	Local $fExists = $oDict.Exists($sKey)
	Local $sRet = $oDict.Item($sKey)
	
	If Not $fExists Then
		;ConsoleWrite($oDict.Exists($sKey) & @CRLF)
		$oDict.Remove($sKey)
	EndIf
	
	Return $sRet
EndFunc


или так:
Код:
Local $vValue = ($oDict.Exists($vKey) ? $oDict.Item($vKey) : '') ; читаем не существующий ключ
 
Верх