Индексированные присвоения объекта находятся в трех формах — круглые скобки, фигурные скобки и точечное имя:
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)
вызовов, где
S
struct
имеет эти значения:
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}