Индексированные присвоения объекта находятся в трех формах — круглые скобки, фигурные скобки и точечное имя:
A(I) = B A{I} = B A.name = B
Каждый из этих операторов приводит к вызову MATLAB® к subsasgn
метод класса A
, или вызов встроенного subsasgn
функционируйте если класс 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 вызывает метод установки.
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}