如何清除持久变量在MATLAB方法(How to clear a persistent variab

2019-10-16 18:37发布

我有一个包含了使用持久变量的方法的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

这是所需的输出。 问题是,该行clear functions在classdef文件清除内存中的所有功能。 我需要一种方法来清除与一个更小的范围。 例如,如果hasPersistent' was a function instead of a method, the appropriately scoped clear statement would be明确hasPersistent`。

我知道, clear obj.hasPersistentclear testMe.hasPersistent都无法清除持久变量。 clear obj同样是一个坏主意。

Answer 1:

继在意见的讨论中,我想你想使用让foo的私人财产,并伴有相应的increment / reset公共职能。



Answer 2:

你绝对不需要一个持久变量来实现你想要什么。 但是,在任何情况下,从你到一个类的方法去除持久变量clear相应的类。 在你的情况, clear testMe应该做你想要什么。

一个相关的问题是如何清除持久变量在包功能。 要删除持久变量myVar从函数foo包中foo_pkg你必须这样做:

clear +foo_pkg/foo

这应该工作,只要文件夹的父文件夹+foo_pkg是在MATLAB路径。



文章来源: How to clear a persistent variable in a MATLAB method