我有一个MATLAB类,它包含一个使用持久变量的方法。当满足某些条件时,我需要清除持久变量而不清除方法所属的对象。我已经能够做到这一点,但只能使用范围过大的clear functions
。
此问题的classdef .m文件:
classdef testMe
properties
keepMe
end
methods
function obj = hasPersistent(obj)
persistent foo
if isempty(foo)
foo = 1;
disp(['set foo: ' num2str(foo)]);
return
end
foo = foo + 1;
disp(['increment foo: ' num2str(foo)]);
end
function obj = resetFoo(obj)
%%%%%%%%%%%%%%%%%%%%%%%%%
% this is unacceptably broad
clear functions
%%%%%%%%%%%%%%%%%%%%%%%%%
obj = obj.hasPersistent;
end
end
end
使用此类的脚本:
test = testMe();
test.keepMe = 'Don''t clear me bro';
test = test.hasPersistent;
test = test.hasPersistent;
test = test.hasPersistent;
%% Need to clear the persistent variable foo without clearing test.keepMe
test = test.resetFoo;
%%
test = test.hasPersistent;
test
这个输出是:
>> testFooClear
set foo: 1
increment foo: 2
increment foo: 3
increment foo: 4
set foo: 1
test =
testMe
Properties:
keepMe: 'Don't clear me bro'
Methods
这是所需的输出。问题是classdef文件中的行clear functions
清除了内存中的所有函数。我需要一种方法来缩小范围。例如,如果hasPersistent' was a function instead of a method, the appropriately scoped clear statement would be
清除hasPersistent`。
我知道clear obj.hasPersistent
和clear testMe.hasPersistent
都无法清除持久变量。 clear obj
同样是一个坏主意。
答案 0 :(得分:4)
根据评论中的讨论,我认为您希望将make foo
作为私有财产,并附带相应的increment
/ reset
公共函数。
答案 1 :(得分:2)
您绝对不需要持久变量来实现您想要的。但是,无论如何,要从类方法中删除持久变量,您必须clear
相应的类。在您的情况下,clear testMe
应该做您想要的。
相关问题是如何清除包函数中的持久变量。要从包myVar
中的函数foo
中删除持久变量foo_pkg
,您必须执行此操作:
clear +foo_pkg/foo
只要文件夹+foo_pkg
的父文件夹位于MATLAB路径中,这就应该有效。