如何在 MATLAB 方法中清除持久变量
Posted
技术标签:
【中文标题】如何在 MATLAB 方法中清除持久变量【英文标题】:How to clear a persistent variable in a MATLAB method 【发布时间】:2012-05-27 23:11:48 【问题描述】:我有一个 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
clear hasPersistent`。
我知道clear obj.hasPersistent
和clear testMe.hasPersistent
都无法清除持久变量。 clear obj
同样是个坏主意。
【问题讨论】:
您是否试图模拟 C++/Java 意义上的“静态属性”(类的属性而不是类实例)? 我不这么认为,虽然我的 C++/Java 很弱,所以有可能是我,但这不是我的本意。我不这么认为的原因是持久变量foo
在类的实例中不是恒定的。我需要它位于对象实例的本地,并且只需要在函数 hasPersistent
内部。
要理解我的意思,创建类test2 = testMe();
的另一个实例并调用test2.hasPersistent
... 这两个实例共享相同的持久变量foo
。如果您不想要这种行为,为什么不使用常规属性(如keepMe
属性)并将其设为private
?
谢谢。我没有意识到这是工作区中有多个 testMe
对象的行为。您使用私有属性的建议是完全正确的,对我来说应该是显而易见的。这可能意味着是时候停下来过夜并上床睡觉了。如果您发布“改用私有财产”的答案,我会选择并投票。谢谢!
【参考方案1】:
根据 cmets 中的讨论,我认为您想使用将 foo
设为私有属性,并附带适当的 increment
/reset
公共函数。
【讨论】:
【参考方案2】:您绝对不需要持久变量来实现您想要的。但是,无论如何,要从类方法中删除持久变量,您必须 clear
相应的类。在你的情况下,clear testMe
应该做你想做的事。
一个相关的问题是如何清除包函数中的持久变量。要从 foo
包内的函数 foo_pkg
中删除持久变量 myVar
,您必须这样做:
clear +foo_pkg/foo
只要文件夹 +foo_pkg
的父文件夹位于 MATLAB 路径中,这应该可以工作。
【讨论】:
以上是关于如何在 MATLAB 方法中清除持久变量的主要内容,如果未能解决你的问题,请参考以下文章