1

我有一个 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 functionsclassdef 文件中的行清除了内存中的所有函数。我需要一种在更小的范围内清除的方法。例如,如果hasPersistent' was a function instead of a method, the appropriately scoped clear statement would be清除 hasPersistent`。

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

4

2 回答 2

4

在评论中的讨论之后,我认为您想使用foo私有财产,并附带适当的increment/reset公共功能。

于 2012-05-28T00:20:18.287 回答
3

您绝对不需要持久变量来实现您想要的。但是,无论如何,要从类方法中删除持久变量,您必须clear使用相应的类。在你的情况下,clear testMe应该做你想做的事。

一个相关的问题是如何清除包函数中的持久变量。要从包myVar中的函数中删除持久变量,您必须这样做:foofoo_pkg

clear +foo_pkg/foo

只要文件夹的父文件夹+foo_pkg位于 MATLAB 路径中,这应该可以工作。

于 2012-11-19T17:37:04.563 回答