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 functions、classdefファイルの行がメモリ内のすべての関数をクリアすることです。はるかに小さなスコープでクリアする方法が必要です。たとえば、hasPersistent' was a function instead of a method, the appropriately scoped clear statement would behasPersistent`をクリアした場合。

私はそれを知っています、clear obj.hasPersistentそしてclear testMe.hasPersistent両方とも永続変数をクリアすることに失敗します。clear obj同様に悪い考えです。

4

2 に答える 2

4

コメントでの議論に続いて、適切な/公共の機能fooを備えた私有財産を作成することを使用したいと思います。incrementreset

于 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 に答える