Что нового

[Массивы] _List() - Присваивает переменным из списка значения из массива.

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
_List(arr Value, str Variable, [int Declared])

Описание: Дана функция _List(), является подобием функции list() в PHP. Эта функция присваивает списку переменных, значения за одну операцию.

Замечание: Функция _List() работает только с одномерными массивами, индексы которых начинаются с ноля.

Функция и пример:
Код:
Dim $Array[3] = [ _ 
				'Всем привет!', _ 
				'Функция List!', _ 
				'Присваивает переменным значения из массива.' _ 
				]
				
_List($Array, "Greeting, Title, Discription")

ConsoleWrite("Error: " & @error & @CRLF & "Extended: " & @extended &  @CRLF)
ConsoleWrite("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" & @CRLF)
ConsoleWrite( _ 
			"Variable: $Greeting -> " & $Greeting & @CRLF & _ 
			"Variable: $Title -> " & $Title & @CRLF & _ 
			"Variable: $Discription -> " & $Discription & @CRLF _ 
			)
ConsoleWrite("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" & @CRLF)

#Region Function

#cs~~~/ Begin _List /~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

	Name:			_List
	
	Sintaxis:		_List($aValue, $sVariable, [$iDeclared])
	
	Description:	Присваивает переменным из списка значения подобно массиву
	
	Parameters:		$aValue			- Одномерный массив значений, которые нужно присвоить переменным.
					$sVariable		- Строка имён переменных, которым нужно присвоить значения (через запятую).
					$iDeclared		- Проверка на ранее объявленные переменные (опционально).
									  0 - off (Default) 
									  1 - on 
								
	Return values:	Success 		- Возвращает глобально объявленные переменные с присвоенными им значениями,
									  и устанавливает @error и @extended
								
									@error		- 0	нет ошибок
									@extended	- 0								
					
					Failure			- Нечего не возвращает и устанавливает @error и @extended
					
									@error		- 1 параметр $aValue не является массивом
									@extended	- 0
								
									@error		- 2 в параметре $sVariable указаны имена ранние объявленных переменных
													(смотрите $iDeclared)
									@extended	- n количество ранее объявленных переменных в параметре $sVariable

									@error		- 3 параметр $aValue не является одномерным массивом
									@extended	- n указатель размерности массива

									@error		- 4 количество заявленных переменных $sVariable больше или меньше количества
													значений $aValue или наоборот
									@extended	- 0

	Author:			Garrett

#ce~~~/ End _List /~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Func _List($aValue, $sVariable, $iDeclared = 0)
	Local $aVariable, $iCount
		
		$aVariable = StringSplit(StringStripWS($sVariable, 8), ",")
		If $iDeclared Then
			For $i = 1 To $aVariable[0]
				Switch IsDeclared($aVariable[$i])
				Case 1
					$iCount += 1
				Case 0
					Assign($aVariable[$i], "", 2)
				EndSwitch
			Next
			If $iCount <> 0 Then _ 
				Return SetError(2, $iCount)
		EndIf
		
		Select
		Case Not IsArray($aValue)
			Return SetError(1, 0)
		Case UBound($aValue, 0) <> 1
			Return SetError(3, UBound($aValue, 0))
		Case UBound($aValue) <> $aVariable[0]
			Return SetError(4, 0)
		Case Else
			For $i = 0 To UBound($aValue)-1
				Assign($aVariable[$i+1], $aValue[$i], 2)
			Next
		EndSelect
		
	Return SetError(0, 0)
EndFunc ; <!-- _List //-->

#EndRegion Function
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
На этот скрипт плохо реагирует проверка синтаксиса.
Лучше так:

Код:
Dim $Array[3] = [ _ 
                'Всем привет!', _ 
                'Функция List!', _ 
                'Присваивает переменным значения из массива.' _ 
                ]
                
_List($Array, "Greeting, Title, Description")

ConsoleWrite("Error: " & @error & @CRLF & "Extended: " & @extended &  @CRLF)
ConsoleWrite("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" & @CRLF)
ConsoleWrite( _ 
            "Variable: $Greeting -> " & Eval('Greeting') & @CRLF & _ 
            "Variable: $Title -> " & Eval('Title') & @CRLF & _ 
            "Variable: $Description -> " & Eval('Description') & @CRLF _ 
            )
ConsoleWrite("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" & @CRLF)

...
 
Автор
Garrett

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
То, что выдаёт скрипт проверки синтаксиса, в данном случае я воспринимаю как Notice.
Так как при проверке синтаксиса функция не вызывается, а значить переменные, которые будут возвращены в процессе работы скрипта, не видны.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Garrett [?]
То, что выдаёт скрипт проверки синтаксиса, в данном случае я воспринимаю как Notice.
Ну раз уж ты выложил пример на публику, то должен учитывать то, как это воспримут другие ;)

Так как при проверке синтаксиса функция не вызывается, а значить переменные, которые будут возвращены в процессе работы скрипта, не видны.
Это всё поонятно, но это не решает проблему. Твой пример это неправильное использование переменных, я тебе советую “прислушиваться” к результатам проверки синтаксиса, и принимать это как ошибку, возьми за правило - если программа не прошла проверку синтаксиса, то рано или поздно она выйдет из строая (не обязательно, но так граммотнее).

P.S
Как минимум эти переменный нужно объявить, если они не объявлены, то являются анонимными и условными, а значит с ними нужно также и обращаться (использование Eval, Execute).
 
Автор
Garrett

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
CreatoR [?]
Ну раз уж ты выложил пример на публику, то должен учитывать то, как это воспримут другие
Все люди разные и мыслят по-разному. Так что я собственно нечего сверх естественного не вижу, и полностью готов выслушать мнения всех кто пожелает высказаться. :smile:

но это не решает проблему
Какую?

Твой пример это неправильное использование переменных
В чём это выражено?

я тебе советую “прислушиваться” к результатам проверки синтаксиса, и принимать это как ошибку, возьми за правило - если программа не прошла проверку синтаксиса, то рано или поздно она выйдет из строая (не обязательно, но так граммотнее).
Я собственно так и делаю. Однако я заметил, что многие WARNING: сообщения имеют предупреждающий характер, а не утверждающий. Но то, что так будет грамотнее, это однозначно, согласен.

P.SКак минимум эти переменный нужно объявить
Согласен! И даже скажу больше. Не объявляя переменные заранее (по крайней мере, в веб-программирование) вы оставляете лазейку для всякого рода "хакеров".

если они не объявлены, то являются анонимными и условными, а значит с ними нужно также и обращаться (использование Eval, Execute)
Согласен! Кстати на эту тему хочу привести пример, который показывает, что функция Assign не только создаёт переменную, но и декларирует её в глобальном пространстве имён (третий параметр).
Выполните эти два кода, а потом проверти синтаксис.
Код:
Global $test
MsgBox(0, "Declared: " & IsDeclared ("test"), "$test = " & $test)
Assign("test","Test!", 2)
MsgBox(0, "Declared: " & IsDeclared ("test"), "$test = " & $test)

А теперь давайте закомментируем пару строк
Код:
;~ Global $test
;~ MsgBox(0, "Declared: " & IsDeclared ("test"), "$test = " & $test)
Assign("test","Test!", 2)
MsgBox(0, "Declared: " & IsDeclared ("test"), "$test = " & $test)

Второй код, проверку синтаксиса не пройдёт.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Garrett [?]
В чём это выражено?
Это шутка? :smile:
Проблему с проверкой синтаксиса. Выражено это в том что проверка синтаксиса выдаёт ошибки.

многие WARNING: сообщения имеют предупреждающий характер, а не утверждающий
Вот именно, предупреждающий - об опасности например, о неправильности кода например ;). Результаты проверки не долдны ничего утверждать, они призваны имменно предупреждать.

Второй код, проверку синтаксиса не пройдёт.
Так я я об этом же и говорю.
Зато вот так пройдёт:

Код:
Assign("test","Test!", 2)
MsgBox(0, "Declared: " & IsDeclared ("test"), "$test = " & Eval('test'))


;)
 
Автор
Garrett

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
CreatoR [?]
Так я я об этом же и говорю.
Но код рабочий!!! Потому как:
Код:
Assign("test","Test!", 2)

сама в процессе выполнения декларирует переменную test причём глобально! ;)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Garrett [?]
Но код рабочий!!!
А я не говорил что он нерабочий. Перечитай пожалуйста ещё раз тол что я писал, и делай как тебе удобно. Я этот разговор начал по одной простой причине - чтобы те новички, которые увидят данный пример, не брали с него пример :smile:, чтобы учились писать с самого начало правильно, грамотно!

OffTopic:
P.S
Если в некоторых редакторах с поддержкой проверки орфографии набрать слово «Ёжик», то оно будет поддчёркнуто как неправильное. Но мы то знаем что можно «Ёжик» а можно и «Ежик», однако в грамматике правильнее «Ежик» (по крайней мере так было до недавнего времени). Вот так и тут, можно и не объявлять, но грамотнее будет если объявить.



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

Garrett [?]
сама в процессе выполнения декларирует переменную test
Она её не декларирует (кстати по русский это «объявляет» :smile: ), а создаёт и присваивает ей значение.
 
Автор
Garrett

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
CreatoR [?]
Я этот разговор начал по одной простой причине - чтобы те новички, которые увидят данный пример, не брали с него пример , чтобы учились писать с самого начало правильно, грамотно!
Полностью поддерживаю! :ok:

P.SЕсли в некоторых редакторах с поддержкой проверки орфографии набрать слово «Ёжик», то оно будет поддчёркнуто как неправильное. Но мы то знаем что можно «Ёжик» а можно и «Ежик», однако в грамматике правильнее «Ежик» (по крайней мере так было до недавнего времени). Вот так и тут, можно и не объявлять, но грамотнее будет если объявить.
Ну, это не совсем удачный пример :smile:
В данном случае меняется смысловая нагрузка!

Она её не декларирует (кстати по русский это «объявляет» ), а создаёт и присваивает ей значение.
Допустим, она её создаёт и присваивает ей значение, но если бы переменная не объявлялась как Global или Local, то функция IsDeclared возвращала бы ноль. Или я заблуждаюсь?

P.S. Подведя итог, я могу сказать, что использования функции Eval() для получения значений из переменных, которые будут созданы функцией _List(), является правильным. Однако делает её бессмысленной.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Garrett [?]
это не совсем удачный пример
Может и так, но смысл думаю понятен.

Или я заблуждаюсь?
Нет, со словами можно играться очень и очень много, но это почти ничего не меняет.

использования функции Eval() для получения значений из переменных, которые будут созданы функцией _List(), является правильным
Да!

Однако делает её бессмысленной
Нет!

P.S
Думаю на этом хватит, функция получилась полезной, и это главное в данном разделе :beer:.
 
Верх