Автор Тема: Объект Scripting.Dictionary произвольно создает ключ  (Прочитано 554 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Онлайн joiner [?]

  • Расмус-бродяга
  • Локальный модератор
  • *
  • Сообщений: 2924
  • Репутация: 493
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Пример
Код: AutoIt [Выделить]
#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)

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

Русское сообщество AutoIt

Объект Scripting.Dictionary произвольно создает ключ
« Отправлен: Апрель 01, 2019, 13:44:22 »

Оффлайн Cytrus [?]

  • Новичок
  • *
  • Сообщений: 83
  • Репутация: 1
    • Награды
  • Версия AutoIt: 3.3.14.0
Таким выражением вы добавляете ключ в коллекцию, если он отсутствует.

Онлайн joiner [?]

  • Расмус-бродяга
  • Локальный модератор
  • *
  • Сообщений: 2924

  • Автор темы
  • Репутация: 493
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Разве?
Цитировать
Item
Устанавливает или читает новое значение указанного ключа. Значение может быть типом данных: строка, числа целое и с плавающей точкой, логическое значение, бинарные данные.

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

Русское сообщество AutoIt

Re: Объект Scripting.Dictionary произвольно создает ключ
« Ответ #2 Отправлен: Апрель 01, 2019, 15:18:33 »

Оффлайн Cytrus [?]

  • Новичок
  • *
  • Сообщений: 83
  • Репутация: 1
    • Награды
  • Версия AutoIt: 3.3.14.0
Ну да.

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

Код: AutoIt [Выделить]
#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")
 

« Последнее редактирование: Апрель 01, 2019, 15:37:44 от Cytrus »

Онлайн joiner [?]

  • Расмус-бродяга
  • Локальный модератор
  • *
  • Сообщений: 2924

  • Автор темы
  • Репутация: 493
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Cytrus  [?]
Цитировать
Так добавляется ключ, если он отсутствует.
это я уже понял, экспериментальным образом. когда ловил плавающий баг в своем коде
нашел в справке майкрософта
Цитировать
Если ключ не найден при изменении элемента, с указанным _newitem_создается новый ключ . Если ключ не найден, при попытке возврата существующего элемента, создается новый ключ и его соответствующего элемента оставить пустым.
Отсюда
в нашей справке
нет этого. просьба к тому, кто имеет доступ, дополнить описание в русской справке



Русское сообщество AutoIt

Re: Объект Scripting.Dictionary произвольно создает ключ
« Ответ #4 Отправлен: Апрель 01, 2019, 15:59:13 »

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 4074
  • Репутация: 1080
    • Награды
  • Версия AutoIt: 3.3.14.0
joiner  [?]
Цитировать
в нашей справке нет этого
И не только в нашей. Некоторые даже считают этот способ экзотическим :)
4.4. Неявное добавление ключа в Dictionary

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 8070
  • Репутация: 2311
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.14.0
А если так:

Код: AutoIt [Выделить]
#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


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



Правила, Поиск, Супер тема


AutoIt is simple, subtle, elegant.


«Не оказываю тех. поддержку через ПМ/ICQ, и по электронной почте - для этого есть форум. (C)»
«Законы Мэрфи неоспоримы!»


Мои работы

Русское сообщество AutoIt

Re: Объект Scripting.Dictionary произвольно создает ключ
« Ответ #6 Отправлен: Апрель 02, 2019, 00:00:53 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
3 Ответов
3673 Просмотров
Последний ответ Декабрь 31, 2010, 15:01:00
от Nerfair
2 Ответов
3540 Просмотров
Последний ответ Октябрь 03, 2011, 01:49:41
от eil
3 Ответов
3161 Просмотров
Последний ответ Декабрь 14, 2011, 18:29:19
от Yuriy
3 Ответов
4255 Просмотров
Последний ответ Апрель 10, 2013, 11:49:48
от Renz
17 Ответов
9798 Просмотров
Последний ответ Август 19, 2016, 22:27:46
от Core2Duo76
5 Ответов
2844 Просмотров
Последний ответ Июнь 04, 2016, 19:10:57
от k790
1 Ответов
1031 Просмотров
Последний ответ Октябрь 17, 2016, 16:32:56
от Vovsla
2 Ответов
912 Просмотров
Последний ответ Январь 04, 2017, 15:23:27
от ra4o
2 Ответов
575 Просмотров
Последний ответ Октябрь 31, 2017, 10:54:56
от КашаК
1 Ответов
828 Просмотров
Последний ответ Май 11, 2018, 09:37:46
от pww2000