Индексируемое присвоение

Как индексируемые работы присвоения

Индексированные присвоения объекта находятся в трех формах — круглые скобки, фигурные скобки и точечное имя:

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. тип является символьным вектором, содержащим' ()', '{}', или'.' определение используемого типа индексации.

  • S. нижние индексы являются массивом ячеек или символьным массивом, содержащим фактические индексы или имя поля. Двоеточие, используемое в качестве индекса, передается в массиве ячеек как символ ':'. Области значений задали использование двоеточия (e. g., 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}

Похожие темы

Была ли эта тема полезной?