Привык использовать функции не только для повторяющихся задач, но и для массивных кусков кода. Например мне нужно сформировать строку с OID из массива и передать ее по ssh, я конечно могу ее сформировать прямо внутри блока, но такая политика сделает код менее читабельным. И вот тут у скрипта Mikrotik возникает проблема - функции должны быть глобальными. Стараюсь по минимуму использовать глобальный контекст, но вызвать локальную функцию из локальной функции нельзя. Только глобальную. Даже с передачей в локальной переменной именованного массива (:local MyVar{"X"="Y";"Y"="Z"}) бывают проблемы. Поэтому приходится использовать глобальный контекст. Не забываем для глобального контекста внутри функции объявлять функцию/переменную в глобальном контексте (я бы назвал не объявлять, а инициализировать, она как бы есть, но функция о ней ничего не знает, но на сайте микротика написано declared).
Не работает:
:global MyVar 0
:local MyFunc do={
:put $MyVar
}
$MyFunc
работает:
:global MyVar 0
:local MyFunc do={
:global MyVar
:put $MyVar
}
$MyFunc
Не работает:
:local MyFunc2 do={
:return ($1+$2)
}
:local MyFunc do={
:return ([$MyFunc2 $a $b])
}
:put [$MyFunc a=2 b=3]
работает:
:global MyFunc2 do={
:return ($1+$2)
}
:local MyFunc do={
:global MyFunc2
:return ([$MyFunc2 $a $b])
}
:put [$MyFunc a=2 b=3]
Собственно если внимательно прочитать это, то таких проблем возникать не должно
Комментариев нет:
Отправить комментарий