Oop 如何在MATLAB方法中清除持久变量

Oop 如何在MATLAB方法中清除持久变量,oop,matlab,persistent,Oop,Matlab,Persistent,我有一个MATLAB类,它包含一个使用持久变量的方法。当满足某些条件时,我需要清除持久变量,而不清除方法所属的对象。我已经能够做到这一点,但只是通过使用清除函数,这对于我来说范围太广了 此问题的classdef.m文件: classdef testMe properties keepMe end methods function obj = hasPersistent(obj) persistent foo

我有一个MATLAB类,它包含一个使用持久变量的方法。当满足某些条件时,我需要清除持久变量,而不清除方法所属的对象。我已经能够做到这一点,但只是通过使用
清除函数
,这对于我来说范围太广了

此问题的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
作为私有财产,并附带适当的
增量
/
重置
公共功能。

在评论中讨论之后,我认为您希望使用make
foo
私有属性,同时使用适当的
增量
/
重置
公共函数。

您肯定不需要持久变量来实现所需的功能。但是,在任何情况下,要从类方法中删除持久变量,必须
清除相应的类。在您的情况下,
清除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
对象的行为。你提出的使用私人房产的建议是完全正确的,对我来说应该是显而易见的。这可能意味着是时候停下来过夜睡觉了。如果你的回答是“改为使用私有财产”,我会选择并投票。谢谢