プロパティのメタデータにおける既定値の検出
既定値
クラスの定義では、プロパティの既定値を明示的に指定できます (既定値をもつプロパティの定義を参照)。プロパティの既定値がクラスによって明示的に定義されているかどうかや既定値を、プロパティの matlab.metadata.Property
オブジェクトから判定します。
matlab.metadata.Property
データ
クラスの matlab.metadata.Class
オブジェクトには、クラスで定義されている各プロパティ (プライベートなアクセスや保護されたアクセスをもつプロパティを含む) に対する matlab.metadata.Property
オブジェクトが含まれています。
たとえば、下記のように PropertyWithDefault
クラスの matlab.metadata.Class
オブジェクトを取得します。
classdef PropertyWithDefault properties Date = date RandNumber = randi(9) end end
matalb.metadata.Class
オブジェクトから、matlab.metadata.Property
オブジェクトの配列を取得します。
mc = ?PropertyWithDefault; % matlab.metadata.Class object mp = mc.PropertyList; % matlab.metadata.Property array
配列 mp
内の 2 番目の要素は RandNumber
プロパティの matlab.metadata.Property
オブジェクトです。matlab.metadata.Property
オブジェクトのリストにより、オブジェクトのプロパティに含まれている情報が以下のように示されます。
mp(2)
property with properties: Name: 'RandNumber' Description: '' DetailedDescription: '' GetAccess: 'public' SetAccess: 'public' Dependent: 0 Constant: 0 Abstract: 0 Transient: 0 Hidden: 0 GetObservable: 0 SetObservable: 0 AbortSet: 0 NonCopyable: 0 GetMethod: [] SetMethod: [] HasDefault: 1 DefaultValue: 5 DefiningClass: [1×1 matlab.metadata.Class]
リストされた matlab.metadata.Property
の 2 つのプロパティにより、既定値に関する以下の情報が提供されます。
HasDefault
— クラスでプロパティの既定値が指定されている場合はtrue
(1 として表示)、指定されていない場合はfalse
になります。DefaultValue
— クラスでプロパティの既定値が定義されている場合は、その既定値が格納されます。既定値が式の場合、DefaultValue
の値は式の評価の結果となります。
式で定義されるプロパティの既定値の評価の詳細については、クラス定義内の式の評価を参照してください。
これらのプロパティを使用すれば、クラスの定義ファイルを開かずにプログラムを記述してプロパティの既定値を取得できます。これらの matlab.metadata.Property
オブジェクトのプロパティは、組み込みクラスと MATLAB® コードで定義されているクラスの両方のプロパティの既定値を取得する際に使用します。
既定値のクエリ
既定値をクエリする手順は、次のとおりです。
既定値をクエリするプロパティの
matlab.metadata.Property
オブジェクトを取得します。matlab.metadata.Property
HasDefault
プロパティの論理値をテストして、プロパティの既定値が定義されているかどうかを判別します。クラスでDefaultValue
プロパティの既定値が定義されていない場合は、そのプロパティをクエリすると、MATLAB ではエラーが返されます。HasDefault
の値がtrue
の場合は、matlab.metadata.Property
のDefaultValue
プロパティから既定値が取得されます。
matlab.metadata.Class
オブジェクトを取得するには、?
演算子、関数 metaclass
、または matlab.metadata.Class.fromName
静的メソッド (char
ベクトル変数の場合) を使用します。
matlab.metadata.Class
オブジェクトの PropertyList
には、matlab.metadata.Property
オブジェクトの配列が含まれています。どのプロパティがどの matlab.metadata.Property
オブジェクトに対応するかを識別するには、matlab.metadata.Property
の Name
プロパティを使用します。
たとえば、次のクラスはプロパティの既定値を定義しています。
classdef MyDefs properties Material = 'acrylic' InitialValue = 1.0 end end
Material
プロパティの既定値を取得するには、次の手順に従います。アプリケーションに応じて、必要なエラー チェックを含めてください。
クラスの
matlab.metadata.Class
オブジェクトを取得します。mc = ?MyDefs;
matlab.metadata.Class
のPropertyList
プロパティから、matlab.metadata.Property
オブジェクトの配列を取得します。mp = mc.PropertyList;
配列の長さ (
mp
) は、プロパティの数と等しくなります。matlab.metadata.Property
のName
プロパティを使用すると、目的のプロパティを見つけることができます。for k = 1:length(mp) if (strcmp(mp(k).Name,'Material') ...
Material
プロパティの既定値をクエリする前に、HasDefault
のmatlab.metadata.Property
をテストして、MyClass
でこのプロパティの既定の値が定義されているかを判別します。if mp(k).HasDefault dv = mp(k).DefaultValue; end
DefaultValue
プロパティは読み取り専用です。クラス定義で既定値を変更すると、DefaultValue
プロパティの値が変わります。既定値をクエリは、プロパティへのアクセスが制限されている場合でも実行できます。
抽象プロパティと動的プロパティには既定値を定義できません。したがって、MATLAB でこれらの属性をもつプロパティの既定値をクエリしようとすると、エラーが返されます。エラーの発生を防ぐために、DefaultValue
プロパティをクエリする前に、必ず matlab.metadata.Property
の HasDefault
プロパティの論理値をテストするようにします。
既定値が式として定義されている場合
クラス定義では、プロパティの既定値を MATLAB 式として定義できます (詳細は、クラス定義内の式の評価を参照)。MATLAB では、これらの式は既定値が初めて必要になったとき (クラスの最初のインスタンスを作成する際など) に評価されます。
matlab.metadata.Property
の DefaultValue
プロパティをクエリすると、MATLAB で既定値の式がまだ評価されていない場合は、式が評価されます。したがって、プロパティの既定値をクエリしたときに、MATLAB で式の評価によってエラーまたは警告が発生した場合は、エラーまたは警告が返されます。例については、プロパティの式にエラーがある場合を参照してください。
プロパティの既定値が明示的に定義されていない場合
次の MyClass
では、Foo
プロパティの既定値が明示的に定義されていません。
classdef MyFoo properties Foo end end
Foo
プロパティの matlab.metadata.Property
インスタンスでは、HasDefault
の値は false
です。Foo
の既定値がクラスで明示的に定義されていないため、DefaultValue
プロパティにアクセスしようとするとエラーが発生します。
mc = ?MyFoo; mp = mc.PropertyList(1); mp.HasDefault
ans = 0
dv = mp.DefaultValue;
No default value has been defined for property Foo
抽象プロパティ
次の MyClass
クラスでは、Foo
プロパティが Abstract
に定義されています。
classdef MyAbst properties (Abstract) Foo end end
Foo
プロパティの matlab.metadata.Property
インスタンスでは、HasDefault
プロパティの値は false
です。これは、Abstract
プロパティには既定値を定義できないからです。DefaultValue
にアクセスしようとすると、エラーが発生します。
mc = ?MyAbst; mp = mc.PropertyList(1); mp.HasDefault
ans = 0
dv = mp.DefaultValue;
Property Foo is abstract and therefore cannot have a default value.
プロパティの式にエラーがある場合
次の MyPropEr
クラスでは、Foo
プロパティの既定値が式で定義されていますが、この式が評価されるとエラーになります。
classdef MyPropEr properties Foo = sin(pie/2) end end
Foo
プロパティの matlab.metadata.Property
オブジェクトでは、HasDefault
プロパティの値は true
です。これは、Foo
に既定値があるからです。
sin(pie/2)
ただし、この式ではエラーが返されます (pie
は円グラフを作成する関数です。pi
という値ではありません)。
mc = ?MyPropEr; mp = mc.PropertyList(1); mp.HasDefault
ans = 1
dv = mp.DefaultValue;
Error using pie (line 29) Not enough input arguments.
既定値をクエリすると、式が評価され、エラーが返されます。
プロパティに空の既定値が明示的に定義されている場合
MyEmptyProp
では、Foo
プロパティに既定の []
(空の double) を割り当てます。
classdef MyEmptyProp properties Foo = [] end end
Foo
プロパティの matlab.metadata.Property
オブジェクトでは、HasDefault
プロパティの値が true になっています。DefaultValue
にアクセスすると、[]
という値が返されます。
mc = ?MyEmptyProp; mp = mc.PropertyList(1); mp.HasDefault
ans = 1
dv = mp.DefaultValue;
dv = []