Автор Тема: [Баг] Assign создаёт не валидные переменные  (Прочитано 7165 раз)

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

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827
  • Репутация: 2288
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Как выяснилось, Assign может создать переменную которая является “неправильной” переменной, т.е может содержать практический любые символы, включая пробелы!

А Eval в свою очередь умеет распознавать такие переменные.

Код: AutoIt [Выделить]
Assign("Переменная", "Значение")
MsgBox(64, 'Title', "$Переменная=" & Eval("Переменная"))


однако использовать такую переменную традиционно нельзя:
Код: AutoIt [Выделить]
$Переменная ;Естественно выдаёт ошибку


Не знаю баг ли это, но это явно непредвиденное поведение, хотя и весьма полезное.


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


AutoIt is simple, subtle, elegant.


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


Мои работы

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

[Баг] Assign создаёт не валидные переменные
« Отправлен: Октябрь 22, 2010, 13:08:24 »

Оффлайн amel27 [?]

  • VIP
  • *
  • Сообщений: 146
  • Репутация: 55
  • Пол: Мужской
    • Награды
Re: [Баг] Assign создаёт не валидные переменные
« Ответ #1, Отправлен: Октябрь 22, 2010, 14:12:16 »
CreatoR
Цитировать
Не знаю баг ли это, но это явно непредвиденное поведение, хотя и весьма полезное.

адназначна фича!.. почти штатный "Scripting.Dictionary" :)

Оффлайн SyDr [?]

  • Локальный модератор
  • *
  • Сообщений: 649
  • Репутация: 157
  • Пол: Мужской
  • Сидра
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: [Баг] Assign создаёт не валидные переменные
« Ответ #2, Отправлен: Октябрь 22, 2010, 15:51:51 »
Возможно, что поведение аналогично поведению с Default - не обрабатывается, чтобы ускорить обработку скрипта.

Оффлайн Garrett [?]

  • Глобальный модератор
  • *
  • Сообщений: 3999
  • Репутация: 960
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: [Баг] Assign создаёт не валидные переменные
« Ответ #3, Отправлен: Октябрь 22, 2010, 15:58:22 »
CreatoR  [?]
Цитировать
Не знаю баг ли это, но это явно непредвиденное поведение, хотя и весьма полезное.

IMHO скорее полезная!  :)

Скорблю и помню.




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

Re: [Баг] Assign создаёт не валидные переменные
« Ответ #3 Отправлен: Октябрь 22, 2010, 15:58:22 »

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2695
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: [Баг] Assign создаёт не валидные переменные
« Ответ #4, Отправлен: Октябрь 22, 2010, 16:09:18 »
А вы создайте тикет, может разработчики исправят это дело, и скорость вернется в привычное русло.

:)


Думай, прежде чем говорить.

Оффлайн Garrett [?]

  • Глобальный модератор
  • *
  • Сообщений: 3999
  • Репутация: 960
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: [Баг] Assign создаёт не валидные переменные
« Ответ #5, Отправлен: Октябрь 22, 2010, 18:14:56 »
IMHO это не баг, потому как именно Assign и Eval тут как нельзя, кстати, показывают нам, что в Autoit`e  можно использовать имена переменных какие вам вздумается. CreatoR кстати это очень наглядный пример к нашему разговору о правильности обращения к переменным! Именно для таких ("своих") переменных видимо и нужны эти функции.
Вот примеры, которые показывают работу Assign и Eval:

Код: AutoIt [Выделить]
Assign("a.b", 12)
Assign("a+b", 12)
Assign("a_b", 12)
Assign("ab", 12)

ConsoleWrite(Eval("a" & "_" & "b") & @CRLF)
ConsoleWrite($a_b & @CRLF)
ConsoleWrite(Eval("a" & "+" & "b") & @CRLF) ; тут как раз таки и нужна функция Eval
;~ ConsoleWrite($a+b & @CRLF) ; тут будет ошибка. плюс зарезервированный оператор
ConsoleWrite(Eval("a" & "." & "b") & @CRLF) ;  тут как раз таки и нужна функция Eval
;~ ConsoleWrite($a.b & @CRLF) ; тут будет ошибка. точка зарезервированна для работы с объектами
ConsoleWrite(Eval("ab") & @CRLF)
ConsoleWrite($ab & @CRLF)


Оффлайн SyDr [?]

  • Локальный модератор
  • *
  • Сообщений: 649
  • Репутация: 157
  • Пол: Мужской
  • Сидра
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: [Баг] Assign создаёт не валидные переменные
« Ответ #6, Отправлен: Октябрь 22, 2010, 18:23:35 »
Цитата: Справка AutoIt
Each variable has a name and must start with the $ character and may only contain letters, numbers and the underscore _ character.

Оффлайн Garrett [?]

  • Глобальный модератор
  • *
  • Сообщений: 3999
  • Репутация: 960
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: [Баг] Assign создаёт не валидные переменные
« Ответ #7, Отправлен: Октябрь 22, 2010, 18:47:11 »
Цитата: Справка AutoIt
Each variable has a name and must start with the $ character and may only contain letters, numbers and the underscore _ character.
Ну тогда ничего не поделаешь!  ;D

P.S. IMHO Eval в других случаях бесполезная функция в Autoit. 

Кстати, кто сможет внятно прокомментировать этот код:
Код: AutoIt [Выделить]
Dim $ab
Assign("ab", 12, 4) ; смысл этой записи?
ConsoleWrite(Eval("ab")) ; смысл этой записи?
ConsoleWrite($ab)
;~ гораздо рациональнее придерживаться правил!
;~ 1. любая переменная должна быть объявлена, прежде чем она будет использоваться
;~ 2. объявлять пространство действия этой переменной
;~ Assign полезная функция, а вот Eval IMHO бесполезная
 


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

Re: [Баг] Assign создаёт не валидные переменные
« Ответ #7 Отправлен: Октябрь 22, 2010, 18:47:11 »

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2695
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: [Баг] Assign создаёт не валидные переменные
« Ответ #8, Отправлен: Октябрь 22, 2010, 19:01:35 »
IMHO Eval в других случаях бесполезная функция в Autoit.

Вот здесь Eval() очень к стати.

Кстати, кто сможет внятно прокомментировать этот код...

Просто код.

:)

Оффлайн SyDr [?]

  • Локальный модератор
  • *
  • Сообщений: 649
  • Репутация: 157
  • Пол: Мужской
  • Сидра
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: [Баг] Assign создаёт не валидные переменные
« Ответ #9, Отправлен: Октябрь 22, 2010, 19:22:29 »
Смсысл использования Eval() состоит в том, что вы можете спокойно обращаться к несуществующим переменным.

Код: AutoIt [Выделить]
Dim $vTemp
While Not @error
    $vTemp = InputBox("Введите число от 1 до 100", "Введите число от 1 до 100", $vTemp)
    If Not @error And $vTemp > 0 And $vTemp < 101 Then Assign('a' & $vTemp, Eval('a' & $vTemp) + 1)
WEnd

$vTemp &= 'Вы ввели следующие числа:' & @CRLF

For $iCount = 1 To 100
    If IsDeclared('a' & $iCount) Then $vTemp &= 'Число ' & $iCount & ' введено ' & Eval('a' & $iCount) & ' раз' & @CRLF
Next

MsgBox(262144, Default, $vTemp)


Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827

  • Автор темы
  • Репутация: 2288
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: [Баг] Assign создаёт не валидные переменные
« Ответ #10, Отправлен: Октябрь 22, 2010, 19:46:44 »
Garrett  [?]
Цитировать
скорее полезная!
А я что написал? :blink:

[?]
Цитировать
Assign и Eval тут как нельзя, кстати, показывают нам, что в Autoit`e  можно использовать имена переменных какие вам вздумается.
Кто показывает? в справке об этом ни слова. Единственное ограничение которое упоминаетя, это использование элементов массива:

Код: AutoIt [Выделить]
$sVarName = "Переменная[0]"
Assign($sVarName, "Значение")
MsgBox(64, 'Title', "$" & $sVarName & "=" & Eval($sVarName))


Вобщем нужно написать тикет, чтобы добавили упоминание данного поведения в справку.

Оффлайн Kaster [?]

  • Бритва, Бритва Оккама
  • Глобальный модератор
  • *
  • Сообщений: 4020
  • Репутация: 622
  • Пол: Мужской
  • Мой Аватар, он лучший самый
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: [Баг] Assign создаёт не валидные переменные
« Ответ #11, Отправлен: Октябрь 23, 2010, 03:16:36 »
OffTopicCreatoR  [?]
Цитировать
чтобы добавили упоминание данного поведения в справку
как бы не убрали эту фичу из проекта, вместо этого  ;D
Конференция посвященная AutoIt на jabber.ru - [email protected]
Как попасть на конференцию читаем тут


Оффлайн amel27 [?]

  • VIP
  • *
  • Сообщений: 146
  • Репутация: 55
  • Пол: Мужской
    • Награды
Re: [Баг] Assign создаёт не валидные переменные
« Ответ #12, Отправлен: Октябрь 23, 2010, 05:44:23 »
Garrett
Цитировать
;~ гораздо рациональнее придерживаться правил!
;~ 1. любая переменная должна быть объявлена, прежде чем она будет использоваться
;~ 2. объявлять пространство действия этой переменной
;~ Assign полезная функция, а вот Eval IMHO бесполезная
следуя такой логике, следовало бы просить разработчиков сделать обязательным объявление всех переменных... ;)

я не вижу тут бага, просто у Assign/Eval больше возможностей распознать имя переменной, чем у интерпретатора, которому приходится его вычленять из потока кода... ограничение ввести можно, но оно будет заведомо искусственным

P.S. кстати, с точки зрения идеологии процедурного программирования Assign/Eval как раз и есть наиболее правильный (базовый) метод работы с переменными... другое дело, что этой парочке не хватает Enum(), возвращающей массив задействованных имен переменных, желательно с фильтром по имени (в идеале - regexp)
« Последнее редактирование: Октябрь 23, 2010, 06:16:10 от amel27 »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827

  • Автор темы
  • Репутация: 2288
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: [Баг] Assign создаёт не валидные переменные
« Ответ #13, Отправлен: Октябрь 23, 2010, 12:51:51 »
amel27  [?]
Цитировать
другое дело, что этой парочке не хватает Enum(), возвращающей массив задействованных имен переменных, желательно с фильтром по имени (в идеале - regexp)
Отличная идея, нужно бы разработчикам подкинуть.

Оффлайн SyDr [?]

  • Локальный модератор
  • *
  • Сообщений: 649
  • Репутация: 157
  • Пол: Мужской
  • Сидра
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: [Баг] Assign создаёт не валидные переменные
« Ответ #14, Отправлен: Октябрь 23, 2010, 12:54:31 »
Enum в AutoIt есть. Только он другое делает :)

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

Re: [Баг] Assign создаёт не валидные переменные
« Ответ #14 Отправлен: Октябрь 23, 2010, 12:54:31 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
4 Ответов
3346 Просмотров
Последний ответ Декабрь 31, 2010, 14:29:58
от NoMad73rus
9 Ответов
3719 Просмотров
Последний ответ Октябрь 28, 2011, 13:05:31
от agikon
5 Ответов
2141 Просмотров
Последний ответ Апрель 19, 2013, 20:21:00
от AZJIO
15 Ответов
4918 Просмотров
Последний ответ Июнь 30, 2013, 21:02:12
от mef-t
1 Ответов
1989 Просмотров
Последний ответ Январь 07, 2014, 09:02:23
от madmasles
6 Ответов
2020 Просмотров
Последний ответ Январь 16, 2014, 19:46:59
от hellm
2 Ответов
1042 Просмотров
Последний ответ Ноябрь 26, 2014, 17:09:53
от Tasolcheg
20 Ответов
3487 Просмотров
Последний ответ Август 08, 2015, 15:35:45
от edyapd
5 Ответов
1130 Просмотров
Последний ответ Октябрь 28, 2015, 22:05:52
от madmasles
2 Ответов
651 Просмотров
Последний ответ Июнь 24, 2017, 01:36:50
от dr.room