exponenta event banner

Поиск значений по умолчанию в метаданных свойств

Значения по умолчанию

Определения классов могут задавать явные значения по умолчанию для свойств (см. раздел Значения по умолчанию для свойств). Определите, определяет ли класс явное значение по умолчанию для свойства и какое значение по умолчанию берется из свойства meta.property объект.

meta.property Данные

meta.class объект для класса содержит meta.property объект для каждого свойства, определенного классом, включая свойства с частным и защищенным доступом.

Например, получить meta.class объект для PropertyWithDefault класс, показанный здесь:

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

Получить массив meta.property объекты из meta.class объект:

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

Второй элемент в mp массив - это meta.property объект для RandNumber собственность. Перечисление 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 свойства предоставляют информацию о значениях по умолчанию:

  • HasDefaulttrue (отображается как 1), если класс задает значение по умолчанию для свойства, false если нет.

  • DefaultValue - содержит значение по умолчанию, если класс определяет значение по умолчанию для свойства. Если значением по умолчанию является выражение, значение DefaultValue является результатом оценки выражения.

Дополнительные сведения об оценке значений свойств по умолчанию, определенных выражениями, см. в разделе Оценка выражений в определениях классов.

Эти свойства обеспечивают программный способ получения значений свойств по умолчанию без открытия файлов определений классов. Используйте эти meta.property свойства объекта для получения значений свойств по умолчанию как для встроенных классов, так и для классов, определенных в коде MATLAB ®.

Запрос значения по умолчанию

Процедура запроса значения по умолчанию включает:

  1. Получение meta.property для свойства, значение по умолчанию которого требуется запросить.

  2. Проверка логического значения meta.property HasDefault , чтобы определить, определяет ли свойство значение по умолчанию. MATLAB возвращает ошибку при запросе DefaultValue если класс не определяет значение по умолчанию для свойства.

  3. Получение значения по умолчанию из meta.property DefaultValue свойство, если HasDefault значение равно true.

Используйте ? оператор, metaclass функции или meta.class.fromName статический метод (работает с char векторная переменная) для получения meta.class объект.

meta.class объект PropertyList содержит массив meta.property объекты. Укажите, какому свойству соответствует meta.property с использованием meta.property Name собственность.

Например, этот класс определяет свойства со значениями по умолчанию:

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

Выполните следующие действия, чтобы получить значение по умолчанию, определенное для Material собственность. Включите проверку ошибок, необходимую для приложения.

  1. Получить meta.class объект для класса:

    mc = ?MyDefs;

  2. Получить массив meta.property объекты из meta.class PropertyList свойство:

    mp = mc.PropertyList;
  3. Длина mp массив равен количеству свойств. Вы можете использовать meta.property Name имущество для поиска интересующего имущества:

    for k = 1:length(mp)
       if (strcmp(mp(k).Name,'Material')
          ...
  4. Перед запросом значения по умолчанию Material свойство, протестируйте HasDefault meta.property чтобы определить, MyClass определяет свойство по умолчанию для этого свойства:

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

DefaultValue свойство доступно только для чтения. Изменение значения по умолчанию в определении класса приводит к изменению значения DefaultValue собственность. Можно запросить значение свойства по умолчанию независимо от его параметров доступа.

Абстрактные и динамические свойства не могут определять значения по умолчанию. Поэтому MATLAB возвращает ошибку при попытке запроса значения свойств по умолчанию с этими атрибутами. Всегда проверять логическое значение meta.property HasDefault перед запросом DefaultValue во избежание создания ошибки.

Значения по умолчанию, определенные как выражения

Определения классов могут определять значения свойств по умолчанию как выражения MATLAB (дополнительные сведения см. в разделе Оценка выражений в определениях классов). MATLAB вычисляет эти выражения при первой необходимости значения по умолчанию, например при первом создании экземпляра класса.

Запрос meta.property DefaultValue свойство заставляет MATLAB вычислять выражение значения по умолчанию, если оно еще не было вычислено. Поэтому запрос значения свойства по умолчанию может возвращать ошибку или предупреждение, если при вычислении выражения MATLAB возникают ошибки или предупреждения. Пример см. в разделе Свойство с выражением ошибок.

Свойство без явного значения по умолчанию

MyClass явно не определяет значение по умолчанию для Foo свойство:

classdef MyFoo
   properties
      Foo
   end
end

meta.property экземпляр для свойства Foo имеет значение false для HasDefault. Поскольку класс явно не определяет значение по умолчанию для 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

meta.property экземпляр для свойства Foo имеет значение false для своих HasDefault свойство, поскольку нельзя определить значение по умолчанию для 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

meta.property объект для свойства Foo имеет значение true для своих HasDefault собственность, потому что 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 свойство:

classdef MyEmptyProp
   properties
      Foo = []
   end
end

meta.property объект для свойства Foo имеет значение true для HasDefault собственность. Доступ DefaultValue возвращает значение []:

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

    1
dv = mp.DefaultValue;
dv =

    []

Связанные темы