Как я могу передать нулевую ссылку в Matlab, чтобы ISA вернула истину? - PullRequest
5 голосов
/ 18 января 2012

У меня есть класс Foo и функция, которая получает Foo в качестве входного параметра.В этой функции я также делаю некоторую проверку ошибок, используя isa:

function (x)  
  if ~isa(x,'Foo')  
     error('Wrong!');  
  end

. Я хочу передать ему что-то похожее на нуль в Java.Однако, когда я передаю его [], я получаю сообщение об ошибке.Можете ли вы сказать мне, что я могу сделать?Я думаю о том, чтобы всегда передавать массив ячеек или проверять empty каждый раз, когда я использую isa.

1 Ответ

9 голосов
/ 18 января 2012

Прежде всего, вы можете проверить наше состояние с помощью

  validParam = isa(x,'Foo') || isempty(x);

Однако лучшим способом будет создание пустого класса с использованием статического метода empty:

  e = Foo.empty(0);
  isa(x,'Foo')

И результат:

isa (Foo.empty (0), 'Foo')

ans =

1  

ПоКстати, это также полезно для другого случая - предположим, что вы хотите динамически расти и массив Foo объектов.Вы можете использовать массив ячеек, но тогда вы потеряете безопасность типов.Вместо этого создайте Foo.empty().

Тем не менее, есть недостаток в использовании этого метода.Он не достаточно умен, чтобы обрабатывать наследование -

Пусть Bar будет классом, который наследует от Foo.

classdef Bar < Foo

end

И вы выделяете новый массив из Foo объектов:

x = Foo.empty(0)

x =

0x0 пустой Foo без свойств.
Методы

Затем попробуйте добавить Bar:

x(end+1) = Bar()

???При преобразовании из Bar в Foo произошла следующая ошибка: Ошибка с использованием ==> Foo Слишком много входных аргументов.

Таким образом, единственное обходное решение для этого случая - использовать массив ячеек.1049 * Edit (1): Похоже, что Matlab добавил специальный класс для обработки наследования:

Описание

matlab.mixin.Heterogene - абстрактный класс, обеспечивающий поддержку формирования гетерогенных массивов.Гетерогенный массив - это массив объектов, которые отличаются по своему определенному классу, но все они являются производными от корневого класса или являются его экземплярами.Корневой класс является производным от matlab.mixin.Heterogene.

...