15

Matlabにはクラスがあります

classdef myClass
    properties
       % some properties here...
    end
    methods ( Access = 'public' )
        function obj = myClass()
            % constructor...
        end
        function obj = delete( obj )
             % suppose to be destructor...
             fprintf(1, 'delete\n');
        end
    end % public methods
end

clearタイプの変数のときのMatlabのデフォルトの動作は何myClassですか? 例えば:

>> m = myClass();
>> clear m

この段階でMatlabがデストラクタを呼び出すことを期待していますmが、そうではないようです!!

私の質問:

  1. clear変数を ing するときにデストラクタを強制的に呼び出すにはどうすればよいですか?

  2. このMatlabのデフォルトの動作は意味がありますか? clear変数を ing するときにデストラクタを呼び出す方が論理的ではありませんか?

  3. Matlab のクラスに detructor メソッドがない (つまり、クラスが破棄されたときに呼び出される既定のメソッドがない) 可能性はありますか? または、何か不足していますか?

  4. から派生したクラスだけhandleがデストラクタ (deleteメソッド) を持つことは可能ですか?

ありがとう!

編集:ジョナスの答えに続いて、簡単な要約:

Matlab には、値クラス (デフォルト)とハンドル クラス (スーパー クラスから派生handle)の 2 種類のクラスがあります。値クラスはパフォーマンスが向上する傾向がありますが、デストラクタ機能はありません。

handledeleteクラスには、クラスが破棄されるときに呼び出されるデストラクタ関数があります。クラスデストラクタの詳細については、この質問を参照してください。handle

値クラスにデストラクタのような機能が必要な場合は、Jona の回答でonCleanup機能を利用する方法が提案されています。

良い答えと洞察力のあるコメントをありがとう!

4

1 に答える 1

13

Deleteは、値クラスではなく、ハンドル クラスのクラス デストラクタとしてのみ定義されます (したがって、Q4 の答えは「はい」です。ドキュメントへの前のリンクを参照してください)。値クラスは、参照ではなく値で渡され、デストラクタなどの内部の多くがユーザーから隠されているという点で、標準の Matlab 配列と非常によく似ています。代わりに、通常は高速です (たとえば、この SO の質問を参照してください)。

したがって、delete メソッドを呼び出したい場合は、 onCleanupdelete(m)機能を使用することをお勧めします (実際には何も削除されないため、プライベート メソッドにすることをお勧めします)。

classdef myTestClass
    properties
       % some properties here...
    end
    properties (Hidden)
        cleanup
    end
    methods ( Access = 'public' )
        function obj = myTestClass()
            % constructor...
            obj.cleanup = onCleanup(@()delete(obj));
        end
    end 
    methods ( Access = 'private' )
        %# I suggest hiding the delete method, since it does not
        %# actually delete anything
        function obj = delete( obj )
             fprintf(1, 'delete\n');
        end
    end % public methods
end
于 2012-12-27T16:16:28.277 に答える