То, что вы видите, является ожидаемым поведением. Это выглядит странно, но рассмотрим следующий пример:
global x = 5;
function say_x ()
global x = 3;
disp (x);
endfunction
say_x ();
x = 7;
say_x ();
Что возвращает:
5
7
Обратите внимание, что вам нужно объявить x
внутри функций для доступа к глобальной переменной. Также обратите внимание, что присвоение ему значения 3
не работает. Причина в том, что такие строки, как persistent x = 3
или global x = 3
, оцениваются только в первый раз. Это означает, что когда вы вызываете say_x()
, x
уже имеет значение, поэтому ему никогда не присваивается значение 3
(правая часть даже не оценивается).
В настоящее время; к вашей фактической проблеме, которая заключается в том, что все это происходит в таблице main/base namespace/symbol, перепутанной с тем, что должен делать clear()
. Вы запускаете это:
global x = 1;
clear x;
global x = 2;
x # you are surprised that x is 1 instead of 2
Во-первых, обратите внимание, что clear()
на самом деле не очищает значения переменных. Это удалит их имена из таблицы символов. Обратите внимание на текст справки от clear()
:
-- Command: clear [options] pattern ...
Delete the names matching the given patterns from the symbol table.
С «обычными» переменными имена не будут больше нигде, и вы эффективно удалите их значение. Но это не так с глобальными переменными. Их значения останутся где-то, готовые стать доступными в следующий раз, когда будет определена глобальная переменная с их именем.
Что происходит, когда вы пытаетесь снова определить x
, так это то, что это имя уже существует в таблице символов глобальных переменных. Таким образом, вы возвращаете его в текущую таблицу символов (точно так же, как это происходит внутри функции), а правая часть (= 2
) никогда не оценивается.
Как вы уже выяснили, чтобы действительно удалить имена из глобальной таблицы символов, вам нужно использовать clear -global
(как описано в тексте справки clear
).
person
carandraug
schedule
22.02.2016