Что нового

использывание значения функции (массив) не присваивая его переменной

running-frag

why me?
Сообщения
441
Репутация
60
Вопрос наверное немного странный, но можно ли как то использывать значения которые возвращаются в виде массива не присваивая их переменной, ну вот простейший пример.

Код:
If StringInStr ($_string, " ") Then
	Local $_split = StringSplit ($_string, " ", 1)
	$_string = $_split[1]
EndIf

Хочется тоже самое только без переменной
Код:
Local $_split

и речь не идёт о чётких функциях. Речь идёт о любой функции что отдаёт массив.


PS: Ну т.е. как в питоне, если кто знаком.
Код:
some = func().[1]
 
Автор
R

running-frag

why me?
Сообщения
441
Репутация
60
т.е. как я понимаю других вариантов нет :( печально

ps: мне критично на версию 3.3.6.1
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Всегда можно заменить.

Код:
$some = _func($_string, 1)

Func _func($_string, $_index)
	If StringInStr($_string, " ") Then
		Local $_string = StringSplit($_string, " ", 1)
		If UBound($_string) > $_index Then
			Return $_string[$_index]
		EndIf
	EndIf
	Return ""
EndFunc   ;==>_func
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,487
running-frag [?]
В том что мне и без новой версии "ошибок в скрипте" хватает
Я имел в виду что критичного в использовании переменной для массива?
 
Автор
R

running-frag

why me?
Сообщения
441
Репутация
60
Я не правильно наверное выразился. :stars:
Критично, в плане "интересует решение в рамках версии 3.3.6.1". Т.е. я не использую другие версии. И пока не планирую переходить.

Почему вообще поднят топик - пытаюсь убрать лишние обьявления "однострочных" переменных (которые больше чем в одной строке не используются).
 

AZJIO

Меценат
Меценат
Сообщения
2,903
Репутация
1,200
running-frag
Сделай переменную $tmp и всё что используется разово отправляешь к неё. Можно не опасаться ошибки, ведь любая операция, где используется $tmp первоначально её перезаписывает, и то что вней было первоначально неважно.

Но тут неприятность: теряются имена переменных которые позволяют понять текущее содержимое, а для незнающих скрипт вообще запутает.

По возможности делить на функции где переменные можно плодить особо не опасаясь что будет занимать лишнюю память отсатки, так как при завершении функции переменные исчезают.
 
Автор
R

running-frag

why me?
Сообщения
441
Репутация
60
AZJIO [?]
Сделай переменную $tmp и всё что используется разово отправляешь к неё.
А это хорошая мысля...

Хотя не, могут же быть варианты функция в фукнции. В главной и во вложенной могут быть $tmp. Т.е. может быть перезаписана "случайно", а это потеря данных.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,487
Yashied [?]
Всегда можно заменить.
Можно ещё сразу массив передавать, типа wrapper'а:

Код:
ConsoleWrite(_ArrayWrapper(IniReadSection(@WindowsDir & '\system.ini', '386Enh'), 1, 1) & @LF)

Func _ArrayWrapper($aArr, $iIndex, $iSubItem1 = -1, $iSubItem2 = -1, $iSubItem3 = -1)
	Switch @NumParams - 2
		Case 1
			Return $aArr[$iIndex][$iSubItem1]
		Case 2
			Return $aArr[$iIndex][$iSubItem1][$iSubItem2]
		Case 3
			Return $aArr[$iIndex][$iSubItem1][$iSubItem2][$iSubItem3]
	EndSwitch
	
	Return $aArr[$iIndex]
EndFunc


Или так, с поддержкой безграничного числа размерности (колонок) массива:

Код:
ConsoleWrite(_ArrayWrapper(IniReadSection(@WindowsDir & '\system.ini', '386Enh'), 1, '1') & @LF)

;$sSubItems может содержать номера колонок в массиве (разделены символом |)
Func _ArrayWrapper($aArr, $iIndex, $sSubItems = '')
	Local $sArr = '$aArr[$iIndex]'
	Local $aCols = StringSplit($sSubItems, '|')
	Local $iCols = UBound($aArr, 0)
	
	If $aCols[0] < $iCols Then $iCols = $aCols[0]
	
	For $i = 1 To $iCols
		$sArr &= '[' & $aCols[$i] & ']'
	Next
	
	Return Execute($sArr)
EndFunc
 

AZJIO

Меценат
Меценат
Сообщения
2,903
Репутация
1,200
running-frag
Хотя не, могут же быть варианты функция в фукнции.
В функции Local $tmp принудительно локальная, они ни как не могут пересекаться, на то она и функция - изолирванный участок кода.

Если $tmp будет использоваться всё же более раза, а не как было заявлено
пытаюсь убрать лишние обьявления "однострочных" переменных
то соответсвенно другой вариант - не обезличиать переменную, а придумать уникальное имя. Если размер её несколько байт, можно даже не обнулять её.
 
Автор
R

running-frag

why me?
Сообщения
441
Репутация
60
AZJIO [?]
В функции Local $tmp принудительно локальная, они ни как не могут пересекаться, на то она и функция - изолирванный участок кода.
а, ну да, а я её чего то сразу представил как Global $tmp....
 
Верх