Что нового

Объектно-ориентированное программирование в AutoIt

_dron_

Знающий
Сообщения
84
Репутация
8
Ну знаете переменная типа Variant с трудом преобразовывается и еще есть много чего что трудно будет переписать для возможности компиляции!
Вот вам пространство имен раз уж вы так сильно немогете без него!

используем ее так
1) объявляем пространство имен
Код:
namespace std
          Global $name = 'myprog'
          $data = '01.03.2014'
          $c = 4
endnamespace


2)в месте программы где требуется далее пространство пишем
Код:
using namespace std;<----------
ConsoleWrite($name)


3) пропускаем через транслятор

namespace и endnamespace это область объявления можно так написать NameSpace EndNameSpace
между этими директивами пишем переменные которые вам будут нужны

using namespace - это использование пространства будет использовать одно пространство пока не встретится другая такая директива или конец программы.
в конце программы обязательно пустая строка (не треснете!)

минус нельзя использовать несколько пространств одновременно ( ИМХО вы так реальность разрушите и че потом делать?)

ВНИМАНИЕ: Транслятор предоставлен в целях ознакомления и может содержать ошибки! т. к. авторские права на исходник у меня, то запрещено распространение полностью или частично без моего на то согласия :big_boss: :lol:

че там еще в лицензии пишут ;D
 

_dron_

Знающий
Сообщения
84
Репутация
8
:rofl: в с++ тоже нельзя!
если нужны переменные из нескольких областей то их можно извлечь в локальную переменную

Код:
namespace std1
      $a = 3
      $b = 6
      $c = 6
endnamespace

namespace std2
      $a = 3
      $b = 6
      $c = 6
endnamespace

using namespace std1
local $cc = $c
using namespace std2
$cc += $c


хотя в с++ можно по указателю
Код:
int cc = std1::c + std2::c;


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

новый код доступен указатель вида obj::$var
[box title=новый код]
Код:
#pragma compile(Console, true)

#cs ----------------------------------------------------------------------------

 AutoIt Version: 3.3.10.2
 Author:         _dron_

#ce ----------------------------------------------------------------------------



if $cmdline[0] < 1 Then
   ConsoleWrite('Using: ' & @ScriptName & ' file' & @CRLF)
   Exit(0)
ElseIf not FileExists($cmdline[1]) Then
   ConsoleWrite('File "' & $cmdline[1] & '" not found!!!')
   Exit(0)
EndIf


Global $aNamespace[1][2]
Global $sVarDefine = ''

$sFilePAth = $cmdline[1];@ScriptDir & "\NS_TEST.au3"

$sSource = FileRead($sFilePAth)

$pNamespace_Find = '(?s)[Nn]{1}ame[Ss]{1}pace\s*([[:word:]]{1,})(.*?)[Ee]{1}nd[Nn]{1}ame[Ss]{1}pace'
$pNamespace_Clear = '((?s)[Nn]{1}ame[Ss]{1}pace\s*[[:word:]]{1,}.+[Ee]{1}nd[Nn]{1}ame[Ss]{1}pace)'
$pVariable_Find_Define = '[[:print:]]{0,}(\$[[:word:]]{1,})[[:print:]]{0,}'
$pVariable_Find_NS = '([[:print:]]{0,}\$[[:word:]]{1,}[[:print:]]{0,})'
$pVariable_Find_using = '([[:print:]]{0,})(\$[[:word:]]{1,})([[:print:]]{0,})'
$pVariable_Replace = '([[:print:]]{0,})\$([[:word:]]{1,})([[:print:]]{0,})'
$pUsingNamespace_Find = '[Uu]{1}sing\s*[Nn]{1}ame[Ss]{1}pace\s*([[:word:]]{1,})'
$pUsingNamespace_Clear = '([Uu]{1}sing\s*[Nn]{1}ame[Ss]{1}pace\s*[[:word:]]{1,})'

$aRawNamespace = StringRegExp($sSource,$pNamespace_Find,3)

For $i = 0 To UBound($aRawNamespace)/2 Step 2
   $sName = $aRawNamespace[$i]
   $sRawVars = $aRawNamespace[$i+1]
   $aNameVar = StringRegExp($sRawVars,$pVariable_Find_NS,3)
   $iLenVars = UBound($aNamespace)+UBound($aNameVar)
   $iStart = UBound($aNamespace)-1
   ReDim $aNamespace[$iLenVars][3]
   For $v = 0 to UBound($aNameVar)-1
	  $aNamespace[$iStart+$v][0] = $sName
	  $aNamespace[$iStart+$v][1] = StringRegExp($aNameVar[$v],$pVariable_Find_Define,1)[0]
	  $sVarDefine &= StringRegExpReplace($aNameVar[$v],$pVariable_Replace,"$1$_NS_" & $sName & "_$2$3") & @CRLF
   Next
Next


$sSource = StringRegExpReplace($sSource,$pNamespace_Clear,"#*#*namespace*#*#" & @CRLF)

$sSource = StringRegExpReplace($sSource,"([[:word:]]{1,})\:\:\$([[:print:]]{1,})", "$_NS_$1_$2"& @CRLF)

$aSourceLine = StringRegExp($sSource,'(.*?)\r\n',3)

$sNS_Using = ''
$sSource = ''

For $i = 0 to UBound($aSourceLine)-1
   $bNS = StringRegExp($aSourceLine[$i],$pUsingNamespace_Find,0)
   if $bNS Then
	  $sNS_Using = StringRegExp($aSourceLine[$i],$pUsingNamespace_Find,1)[0]
	  $aSourceLine[$i] = StringRegExpReplace($aSourceLine[$i], $pUsingNamespace_Clear,";_NS_USING " & $sNS_Using )
   EndIf
   if $sNS_Using Then
	  $bVar = StringRegExp($aSourceLine[$i],$pVariable_Find_Define,0)
	  if $bVar Then
		 $sVar_name = StringRegExp($aSourceLine[$i],$pVariable_Find_Define,1)[0]
		 For $v = 0 To UBound($aNamespace)-1
			if $aNamespace[$v][0] = $sNS_Using And $aNamespace[$v][1]=$sVar_name Then
			   $aSourceLine[$i] = StringRegExpReplace($aSourceLine[$i],$pVariable_Replace,"$1$_NS_" & $sNS_Using & "_$2$3")
			EndIf
		 Next
	  EndIf
   EndIf
   $sSource &= $aSourceLine[$i] & @CRLF
Next

$sSource = StringRegExpReplace($sSource,"(.*?)(\#\*\#\*namespace\*\#\*\#)(.*?)", "$1" & $sVarDefine & "$3"& @CRLF)

$sFilePAth = StringRegExpReplace($sFilePAth,'(.*\\)(.*?\.)(.*?)','$1~$2$3')
$sFilePAth = FileOpen($sFilePAth,10)
FileWrite($sFilePAth,$sSource)
[/box]
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
_dron_ [?]
rofl.gif
в с++ тоже нельзя!

А зачем на C++ ровняться? И не трать время и силы на этот код...
 

_dron_

Знающий
Сообщения
84
Репутация
8
ИМХО он портирован на все платформы и один из самых популярных!
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
_dron_ [?]
тебя не смущает что Java Была сделана похожей на с++?

Мне как - то безразлично на что она похожа, да, не спорю, синтаксис у C++ мне нравится, но это единственное что мне в нём может нравится. Вообще тема себя исчерпала, желаемого результата добились (имеется ввиду ООП в AutoIt) и выяснили что в AutoIt никогда не будет пространств имён. Если нужен холивар, то нужно открывать тему в другом разделе.
 

_dron_

Знающий
Сообщения
84
Репутация
8

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Не туда нажал ;) и удалить нельзя, чудо форум...


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

А бы не офтопить, мое мнение что AutoIT namespace вообще не нужны. Нету таких уж неразрешенных проблем что бы их вводить. Если пишете публичную UDF то соблюдайте правила именования функций и переменных. А глобальные переменные можно заменять на local static и описать 2 функции для _get и _set их же.
 

_dron_

Знающий
Сообщения
84
Репутация
8
можно по потробнее про _get и _set а то до меня не дошло! (желательно код)
 

Z_Lenar

Продвинутый
Сообщения
209
Репутация
52
inververs [?]
А глобальные переменные можно заменять на local static и описать 2 функции для _get и _set их же.
Зачем? Если AutoIt процедурно ориентированный язык. Из UDF можно просто возвращать массив и в дальнейшем использовать его при вызове других функций данной UDF. Получится некое подобие дескриптора WinAPI.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Если уж совсем не хочется объявлять глобальную переменную, то можно делать так:
Создаем функцию, которая будет содержать все глобальные переменные, но уже в local видимости и через static, и опишем условие, на получение этих переменных и на запись. Как то так:
Код:
Func __udf_get_set($var, $data = '')
	Local Static $global_array = [2, 3]
	Local Static $global_var = 'переменная'
	If @NumParams = 1 Then
		Return Eval($var)
	Else
		Assign($var, $data, 4)
	EndIf
EndFunc   ;==>__udf_get_set

Теперь из любой фунций UDF можно получить или записать значения переменных по их именам.
Код:
Func _udf_func()
	;Получим переменную для нашего скрипта
	Local $s = __udf_get_set('global_var')
	ConsoleWrite('> переменаня равна: ' & $s & @LF)
	;Поменяем значение.
	__udf_get_set('global_var', 'новое значение')

	;тот же принцип, на примере с массивом
	Local $test = __udf_get_set('global_array')
	_ArrayDisplay($test, 'исходный массив')
	;Перепишем массив
	Local $test = StringSplit('новый массив', '', 3)
	__udf_get_set('global_array', $test)

	;Посмотрим изменения
	Local $test_2 = __udf_get_set('global_array')
	_ArrayDisplay($test_2, 'Массив должен поменяться')
EndFunc   ;==>_udf_func
 
Верх