Oop 如何在MATLAB方法中清除持久变量
我有一个MATLAB类,它包含一个使用持久变量的方法。当满足某些条件时,我需要清除持久变量,而不清除方法所属的对象。我已经能够做到这一点,但只是通过使用Oop 如何在MATLAB方法中清除持久变量,oop,matlab,persistent,Oop,Matlab,Persistent,我有一个MATLAB类,它包含一个使用持久变量的方法。当满足某些条件时,我需要清除持久变量,而不清除方法所属的对象。我已经能够做到这一点,但只是通过使用清除函数,这对于我来说范围太广了 此问题的classdef.m文件: classdef testMe properties keepMe end methods function obj = hasPersistent(obj) persistent foo
清除函数
,这对于我来说范围太广了
此问题的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'是一个函数而不是一个方法,那么适当范围的clear语句将是clear hasPersistent`
我知道clear obj.hasPersistent
和clear testMe.hasPersistent
都无法清除持久变量<代码>清除obj
同样是个坏主意。在评论中讨论之后,我认为您希望使用将foo
作为私有财产,并附带适当的增量
/重置
公共功能。在评论中讨论之后,我认为您希望使用makefoo
私有属性,同时使用适当的增量
/重置
公共函数。您肯定不需要持久变量来实现所需的功能。但是,在任何情况下,要从类方法中删除持久变量,必须清除相应的类。在您的情况下,清除testMe
应该执行您想要的操作
一个相关的问题是如何清除包函数中的持久变量。要从包foo\u pkg
中的函数foo
中删除持久变量myVar
,必须执行以下操作:
clear +foo_pkg/foo
只要文件夹+foo_pkg
的父文件夹位于MATLAB路径中,这应该可以工作。您肯定不需要持久变量来实现所需的内容。但是,在任何情况下,要从类方法中删除持久变量,必须清除相应的类。在您的情况下,清除testMe
应该执行您想要的操作
一个相关的问题是如何清除包函数中的持久变量。要从包foo\u pkg
中的函数foo
中删除持久变量myVar
,必须执行以下操作:
clear +foo_pkg/foo
只要文件夹+foo_pkg
的父文件夹在MATLAB路径中,这应该可以工作。您是否试图在C++/Java意义上模拟“静态属性”(类的属性而不是类实例)?我不这么认为,尽管我的C++/Java非常弱,所以我很可能是,但这不是我的意图。我不这么认为的原因是持久变量foo
在类的实例中不是常量。我需要它是对象实例的本地实例,并且只在函数hasPersistent
中需要它。要理解我的意思,请创建类test2=testMe()的另一个实例代码>并调用test2.hasPersistent
。。。两个实例共享相同的持久变量foo
。如果您不希望出现这种行为,为什么不使用常规属性(如keepMe
属性)并将其设置为私有属性呢?谢谢。我没有意识到这是工作区中多个testMe
对象的行为。你提出的使用私人房产的建议是完全正确的,对我来说应该是显而易见的。这可能意味着是时候停下来过夜睡觉了。如果你的回答是“改为使用私有财产”,我会选择并投票。谢谢你是否在试图模仿C++/Java意义上的“静态属性”(类的属性而不是类实例)?我不这么认为,尽管我的C++/Java非常弱,所以我可能是,但这不是我的意图。我不这么认为的原因是持久变量foo
在类的实例中不是常量。我需要它是对象实例的本地实例,并且只在函数hasPersistent
中需要它。要理解我的意思,请创建类test2=testMe()的另一个实例代码>并调用test2.hasPersistent
。。。两个实例共享相同的持久变量foo
。如果您不希望出现这种行为,为什么不使用常规属性(如keepMe
属性)并将其设置为私有属性呢?谢谢。我没有意识到这是工作区中多个testMe
对象的行为。你提出的使用私人房产的建议是完全正确的,对我来说应该是显而易见的。这可能意味着是时候停下来过夜睡觉了。如果你的回答是“改为使用私有财产”,我会选择并投票。谢谢