2016-07-23 7 views
5

foo.mで定義された関数があるとします。この関数は、structのパラメータthingを取ります。 foothingに変更されたら、私はthingを "ロック"して変更できなくする必要があります。私は本質的にそれを一定にしたい。私はそれがラインのさらに下に変更されていないことを確認するためにこれをしたい。 Matlabでこれをどうやって行うのですか?既に作成されているMatlab構造を定数にするには?

答えて

4

解決策1:良いあなたの構造体を形成するかわからない場合には、事前に

を持っていますあなたは無名関数のハンドルにその変数を「捕獲」とだけ今からそれを使用して構造を参照することができますに。無名関数ハンドルは、作成時にワークスペースの状態を取得します。その要素は元の構造体のようにアクセスできますが、割り当てようとするとエラーが発生します。

など。

>> S_.a = 1; 
>> S_.b = 2; 
>> S = @() S_; 
>> S_.a = 3; 
>> S_ 
S_ = 
    scalar structure containing the fields: 
    a = 3 
    b = 2 
>> S() 
ans = 
    scalar structure containing the fields: 
    a = 1 
    b = 2 

それはあなたが()とそれを呼び出す必要があります迷惑を除き、構文でほぼ同じです。 私はここで端末でそれを使っていますが、明らかに関数のコンテキストでも簡単に使うことができます。

小さい警告; に再定義して匿名関数を上書きすると、明らかに再定義されます。これは、再定義の際にアクセスした新しいワークスペースを継承するためです。

解決策2:あなたは、事前にあなたの構造体の形を知って良い場合:

はあなたの構造体は、フィールドのみabが含まれていることを事前に知っていると仮定します。 'SetAccess'を制限する同じプロパティを持つクラスを作成します。あなたのメインコードで次に

classdef ConstStruct 
    properties (GetAccess = 'public', SetAccess = 'private') 
    a 
    b 
    end 

    methods 
    %constructor 
    function obj = ConstStruct(S) 
     obj.a = S.a; 
     obj.b = S.b; 
    end 
    end 
end 

>> MyStruct = struct('a',1,'b',2) 
MyStruct = 
    a: 1 
    b: 2 
>> MyStruct = ConstStruct(MyStruct) 
MyStruct = 
    ConstStruct with properties: 
    a: 1 
    b: 2 
>> MyStruct.a 
ans = 
    1 
>> MyStruct.a = 2 
You cannot set the read-only property 'a' of 'ConstStruct'. 
+0

@physmomあなたが構造体のフォームを事前に知っていると仮定して、より洗練されたソリューションで更新しました。 –

+0

私は実際にこの「オブジェクトへのキャスト」メソッドを試してみます。それは私が探していたものにかなり近いようですが、私はどこかで定義された "ミラー"オブジェクトを持っているという考えが嫌いです。 – physmom

+0

これは、同じ変数名を使用して古い構造体を上書きする理由です。良いプログラミングの習慣は、通常、異なる変数を保持する同じ変数に対して警告しますが、私はこの場合例外を作ることができると思います:) –

5

あなたは

  1. persistent
  2. mlockを使用してメモリ内にあなたの機能をロックする機能で変数を定義する必要があります。

mlock以降のclear機能は、それを削除しないように、メモリ内の現在実行中の機能をロックします。メモリ内の関数をロックすることで、ファイルに定義された永続変数が再初期化されなくなります。

+0

別の解決策は、オブジェクト指向のコードを使用して満足している場合は、あなたの関数「定数」属性を持つプロパティを初期化メンバ関数を作ることです –

+0

が実際にそれを考えるようになった、私は両方のOPの質問を誤解したと思う。私は彼らがまだ関数の最初のパス内に変数を 'ロック'したと思う。 –

+0

これは知っておいてよかったですが、+1ですが、@タソスパパスタリアンヌの答えは私が探していたものに近いものでした。私は 'mlock'について知らなかった! – physmom

関連する問題