Назначения, индексированные по объекту, имеют три формы - круглые скобки, скобки и имя точки:
A(I) = B A{I} = B A.name = B
Каждая из этих операторов приводит к вызову MATLAB® в subsasgn
метод класса A
, или вызов встроенного subsasgn
function, если класс A
не реализует subsasgn
способ.
MATLAB передает три аргумента subsasgn
и требует subsasgn
для возврата результата присвоения:
A = subsasgn(A,S,B)
Первый аргумент, A
, присваивается ли объекту значение в третьем аргументе B
.
Вторым аргументом является структура индексации, substruct
. S
имеет два поля:
S.type
является char
вектор, содержащий '()'
, '{}'
, или '.'
указание используемого типа индексации.
S.subs
- массив ячеек или символьный массив, содержащий действительные индексы или имя поля. Двоеточие, используемое в качестве индекса, передается в массиве ячеек в качестве символа ':'
. Области значений, заданные с помощью двоеточия (например 2:5
) расширены до 2 3 4 5
.
Для примера оператор назначения:
A(2,3) = B;
генерирует вызов для subsasgn
:
A = subsasgn(A,S,B)
S
содержит:
S.type = '()'
S.subs = {2,3}
Встроенный subsasgn
:
Определяет класс A
. Если B
не является тем же классом, что и A
, затем MATLAB пытается создать объект того же класса, что и A
использование B
как входной параметр. Если эта попытка не удалась, MATLAB возвращает ошибку.
Если A
и B
или может быть сделан, в тот же класс, затем MATLAB назначает значение B
к элементу массива в строке 2
, столбец 3
.
Если A
не существует до выполнения оператора назначения, затем MATLAB инициализирует пять элементов массива, которые приходят раньше A(2,3)
с объектами класса по умолчанию B
.
Точно так же это выражение
A{2,3} = B
Использует эти значения для S
:
S.type ='{}'
S.subs = {2,3}
Встроенный subsasgn
:
Присваивает B
в cell
элемент массива в строке 2
, столбец 3
.
Если A
не существует до выполнения оператора назначения, MATLAB инициализирует пять камеры, которые приходят раньше A(2,3)
с []
. Результатом является массив ячеек 2 на 3.
Это выражение:
A.Name = B
Вызовы A = subsasgn(A,S,B)
где struct
S
имеет следующие значения:
S.type = '.' S.subs = 'Name'
Встроенный subsasgn
:
Присваивает B
в struct
полевые Name
.
Если A
не существует до выполнения оператора назначения, MATLAB создает struct
переменная, A
с Name
поля и присваивает значение
B
в это место поля.
Если struct
A
существует, но не имеет поля Name
, затем MATLAB добавляет поле Name
и присваивает значение B
к новому месту расположения месторождения.
Если struct
A
существует и имеет Name
, затем MATLAB присваивает значение B
на Name
.
Можно переопределить все или некоторые из этих поведений назначения путем реализации subsasgn
метод для вашего класса.
Если A
является объектом, это выражение:
A.Name = B
Вызовы A = subsasgn(A,S,B)
где, S
имеет следующие значения:
S.type = '.' S.subs = 'Name'
Значение по умолчанию subsasgn
:
Попытка назначить B
на Name
свойство.
Если класс A
не имеет Name
свойство, MATLAB возвращает ошибку.
Если на Name
свойство имеет ограниченный доступ (private
или protected
), MATLAB определяет, разрешено ли назначение, на основе контекста, в котором выполняется назначение.
Если класс A
задает метод набора для свойства Name
MATLAB вызывает метод set.
MATLAB применяет все другие атрибуты свойств перед определением, назначать ли B
к свойству Name
.
Эти простые вызовы объединяются для более сложных выражений индексации. В таких случаях length(S)
количество уровней индексации. Для примера,
A(1,2).PropertyName(1:4) = B
вызывает subsasgn(A,S,B)
, где S
массив структур 3 на 1 со значениями:
S(1).type = '()' S(2).type = '.' S(3).type = '()' S(1).subs = {1,2} S(2).subs = 'PropertyName' S(3).subs = {1:4}