Main Content

プロパティのメタデータにおける既定値の検出

既定値

クラスの定義では、プロパティの既定値を明示的に指定できます (Define Properties with Default Valuesを参照)。プロパティの meta.property オブジェクトから、プロパティの既定値がクラスによって明示的に定義されているかどうかや、既定値の値を判定します。

meta.property データ

クラスの meta.class オブジェクトには、クラスで定義されている各プロパティ (プライベートや保護されたアクセスをもつプロパティも含む) に対する meta.property オブジェクトが含まれています。

たとえば、下記のように PropertyWithDefault クラスの meta.class オブジェクトを取得します。

classdef PropertyWithDefault
   properties
      Date = date
      RandNumber = randi(9)
   end
end

meta.class オブジェクトから、meta.property オブジェクトの配列を取得します。

mc = ?PropertyWithDefault; % meta.class object
mp = mc.PropertyList; % meta.property array

配列 mp 内の 2 番目の要素は RandNumber プロパティの meta.property オブジェクトです。meta.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 meta.class]

リストされた meta.property の 2 つのプロパティにより、既定値に関する以下の情報が提供されます。

  • HasDefault — クラスでプロパティの既定値が指定されている場合は true (1 として表示)、指定されていない場合は false になります。

  • DefaultValue — クラスでプロパティの既定値が定義されている場合は、その既定値が格納されます。既定値が式の場合、DefaultValue の値は式の評価の結果となります。

式で定義されるプロパティの既定値の評価の詳細については、クラス定義内の式の評価を参照してください。

これらのプロパティを使用すれば、クラスの定義ファイルを開かずにプログラムを記述してプロパティの既定値を取得できます。これらの meta.property オブジェクトのプロパティは、組み込みクラスと MATLAB® コードで定義されているクラスの両方のプロパティの既定値を取得するのに使用します。

既定値のクエリ

既定値をクエリする手順は、次のとおりです。

  1. 既定値をクエリするプロパティの meta.property オブジェクトを取得します。

  2. meta.property HasDefault プロパティの論理値をテストして、プロパティの既定値が定義されているかどうかを判別します。クラスでプロパティの既定値が定義されていない場合は、DefaultValue をクエリすると MATLAB はエラーを返します。

  3. HasDefault の値が true の場合は、meta.propertyDefaultValue プロパティから既定値を取得します。

meta.class オブジェクトを取得するには、? 演算子、関数 metaclass、または meta.class.fromName 静的メソッド (char ベクトル変数の場合) を使用します。

meta.class オブジェクトの PropertyList には、meta.property オブジェクトの配列が含まれています。どのプロパティがどの meta.property オブジェクトに対応するかを識別するには、meta.propertyName プロパティを使用します。

たとえば、次のクラスはプロパティの既定値を定義しています。

classdef MyDefs
   properties
      Material = 'acrylic'
      InitialValue = 1.0
   end
end

Material プロパティの既定値を取得するには、次の手順に従います。アプリケーションに応じて、必要なエラー チェックを含めてください。

  1. クラスの meta.class オブジェクトを取得します。

    mc = ?MyDefs;

  2. meta.classPropertyList プロパティから、meta.property オブジェクトの配列を取得します。

    mp = mc.PropertyList;
  3. 配列の長さ (mp) は、プロパティの数と等しくなります。meta.propertyName プロパティを使用して、目的のプロパティを見つけます。

    for k = 1:length(mp)
       if (strcmp(mp(k).Name,'Material')
          ...
  4. Material プロパティの既定値をクエリする前に、HasDefaultmeta.property をテストして、MyClass でこのプロパティの既定値が定義されているかを判別します。

    if mp(k).HasDefault
             dv = mp(k).DefaultValue;
          end

DefaultValue プロパティは読み取り専用です。クラス定義で既定値を変更すると、DefaultValue プロパティの値が変わります。既定値をクエリは、プロパティへのアクセスが制限されている場合でも実行できます。

抽象プロパティと動的プロパティには既定値を定義できません。したがって、これらの属性をもつプロパティの既定値をクエリしようとすると、エラーが返されます。エラーの発生を防ぐために、DefaultValue プロパティをクエリする前に、必ず meta.propertyHasDefault プロパティの論理値をテストするようにします。

既定値が式として定義されている場合

クラス定義では、プロパティの既定値を MATLAB 式として定義できます (詳細は、クラス定義内の式の評価を参照)。MATLAB では、これらの式は既定値が初めて必要になったとき (クラスの最初のインスタンスを作成する際など) に評価されます。

meta.propertyDefaultValue プロパティをクエリすると、既定値の式がまだ評価されていない場合は、式が評価されます。したがって、プロパティの既定値をクエリしたときに、式の評価によってエラーまたは警告が発生した場合は、エラーまたは警告が返されます。例については、プロパティの式にエラーがある場合を参照してください。

プロパティの既定値が明示的に定義されていない場合

次の MyClass では、Foo プロパティの既定値が明示的に定義されていません。

classdef MyFoo
   properties
      Foo
   end
end

Foo プロパティの meta.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 プロパティの meta.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 プロパティの meta.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 プロパティの meta.property オブジェクトでは、HasDefault プロパティの値が true になっています。DefaultValue にアクセスすると、[] という値が返されます。

mc = ?MyEmptyProp;
mp = mc.PropertyList(1);
mp.HasDefault
ans =

    1
dv = mp.DefaultValue;
dv =

    []

関連するトピック