2015-06-04 4 views
4

Перегрузка clear() с функцией легко. Но как получить доступ к рабочему пространству восходящей функции (из которой был вызван clear), чтобы очистить рабочее пространство? builtin('clear') очистит только рабочее пространство перегруженной функции.Как перегрузить ясный

function ret = someFun(a,b) 
    ret = a + b; 
    clear 
    ret = 1; 
end 

function clear() 
    persistent boring 
    if isempty(boring), boring = 0; end 
    boring = boring + 1; 
    builtin('clear') 
end 

Скриншот: рабочее пространство функции вверх по течению после вызова перегруженного clear функцию workspace of the upstream function after calling the overloaded clear function

+0

Или вы можете просто не перегружать 'clear'. Возможно, вы могли бы назвать свою функцию 'clearLocal'. Или, учитывая функциональность, которую вы вкладываете в перегруженный 'clear', возможно, вы могли бы назвать это' clearWithCounter'. –

ответ

4

Использование evalin с опцией 'caller'. То есть, заменить вашу линию

builtin('clear')

по

evalin('caller', 'builtin(''clear'')') 

Это будет очистить все переменные из рабочей функции вызывающей.

Если вы хотите хотите очистить все переменные из базового рабочего пространства Matlab используйте 'base' вариант:

evalin('base', 'builtin(''clear'')') 
+4

Несколько лет назад MathWorks провела упражнение, в котором у них появилось множество новых пользователей, и записала их истории в командной строке, чтобы понять, как люди учатся MATLAB. Один парень начал, и по какой-то причине в первую очередь он набрал «clear = 3». После этого его опыт очень быстро спустился, и его история команд включала в себя такие вещи, как «очистить все», «ясность», «CLEAR», «clear dammit», «kill», «kill matlab». Это было довольно забавно. –

+1

После этого некоторые думали, что 'clear' следует превратить в ключевое слово, чтобы вы не могли его перегрузить. Этого никогда не было, так как таких людей много, как OP, которые перегружают 'clear', а обратная совместимость будет проблемой. Но все равно - просто не перегружайте «ясность» по какой-либо причине, хотя ответ @Luis дает вам возможность обойти проблемы. В конце концов, что произойдет, если вы тоже перегрузите 'builtin'? Насколько я знаю, буквально нет возможности выбраться из этого, кроме закрытия MATLAB. –

+0

@SamRoberts Очень забавно! :-) –