Что нового

Ограничение области действия функций и переменных

V

vladu

Гость
Добрый день,

возможно ли ограничить область действия функции и переменной (которая объявлена в начале скрипта и за пределами любой функции)?

Задача:
1) ограничить область видимости функции в пределах скрипта в котором она находится
2) объявленную в начале скрипта переменную сделать видимой только в пределах скрипта
(поставив переменной параметр Local, к сожалению она все равно становится Global)

Заранее спасибо за помощь,
Влад

PS. подозреваю, из-за отсутсвия классов, такое реализовать невозможно
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
vladu [?]
ограничить область видимости функции в пределах скрипта в котором она находится
Что значит ограничить, для каких целей?

объявленную в начале скрипта переменную сделать видимой только в пределах скрипта
Она и так видна в пределах скрипта, или что имеется в виду?
 
Автор
V

vladu

Гость
Например есть несколько скриптов ... один главный А, который подключает несколько дополнительных (В и С). И в дополнительных скриптах могут существовать функции с одинаковыми названиями ...
при запуске AutoIt ругается что существуют функции с одинаковыми названиями.
Цель: не придумывать уникальные названия в каждом скрипте


объявленную в начале скрипта переменную сделать видимой только в пределах скрипта
Она и так видна в пределах скрипта, или что имеется в виду?
К сожалению видна во всех скриптах связанных через include
Пример:

скрипт В.ua3
Код:
Local $var = "B"

Func BFunc ()
	return $var
EndFunc


скрипт С.ua3
Код:
Local $var = "C"

Func CFunc ()
	return $var
EndFunc


скрипт А.ua3
Код:
#include <B.au3>
#include <C.au3>

ConsoleWrite(BFunc() & @CRLF)
ConsoleWrite(CFunc() & @CRLF)



По идее результат в консоли должен быть:
В
С

А фактически:
С
С

что не совсем гууд :(

И еще интересный момент ... на одинаковые названия функций AutoIt ругается а на одинаковые названия переменных нет ... это может привести к логическим ошибкам, которые сложно отловить :(
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Ты неверно истолковываешь действие #include <zzz>
Смысл этого ключевого слова: на этапе компиляции в этом месте вставить текст из файла zzz.
И в твоём случае в итоге на компиляцию пойдёт скрипт
Код:
Local $var = "B"

Func BFunc ()
    return $var
EndFunc

Local $var = "C"

Func CFunc ()
    return $var
EndFunc
 
ConsoleWrite(BFunc() & @CRLF)
ConsoleWrite(CFunc() & @CRLF)


Так что всякие идеи и фантазии можешь забыть, потому что скрипт в точности выполнил всё что написано. И никакие области действия переменных не нарушены, потому что это всё один скрипт.
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
что не совсем гууд

Не совсем гуд - это давать переменным одни и те же названия, используйте тогда массивы.

Код:
Global $var[2]

$var[0] = "B"

Func BFunc ()
    return $var[0]
EndFunc

$var[1] = "C"

Func CFunc ()
    return $var[1]
EndFunc

ConsoleWrite(BFunc() & @CRLF)
ConsoleWrite(CFunc() & @CRLF)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
  • Локальные переменные ("Local") нужно объявлять только внутри функций! Во всех остальных случаях должно быть "Global" (тогда и "ругаться" будет).
  • Те, кто пишет UDF, как правило, для уникальности используют префиксы "_", "__" и т.д.
  • Если это отдельный модуль в рамках одного проекта, то автору ничего не мешает называть переменные как угодно.
  • Так как AutoIt не является компилятором, то создавать локальные переменные и функции в рамках одного модуля (a.k.a. DLL) нельзя.

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

B.au3
Код:
Global $_B_Var = "B"


C.au3
Код:
Global $_C_Var = "C"
 
Автор
V

vladu

Гость
спасибо ... растолковали
я ошибался с принципом #include ... по привычке думал что там отдельный класс

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

еще раз всем спасибо за помощь!
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Можно было бы сделать что то вроде такого:

Код:
;#include #1
$sVar = _AssignEx('MyVar', 'Some Data', 2)
ConsoleWrite($sVar & '=' & Eval($sVar) & @LF)

;#include #2
$sVar = _AssignEx('MyVar', 'Other Data', 2)
ConsoleWrite($sVar & '=' & Eval($sVar) & @LF)


Func _AssignEx($sVarName, $sValue, $iFlag = Default)
	While IsDeclared($sVarName)
		$sVarName = '_' & $sVarName
	WEnd
	
	Assign($sVarName, $sValue, $iFlag)
	Return $sVarName
EndFunc


Саму функцию _AssignEx можно поместить в отдельный скрипт, и добавлять как #include в каждый “модуль” (скрипт).
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
vladu
Код:
Func BFunc ()
    Local $var = "B"
    return $var
EndFunc
 
Верх