Вызов Matlab `loadobj`, когда input является объектом, * перед * он становится` struct`

Мой первый набег на loadobj: я нашел шаблон кода и объяснение:

If the load function encounters an error, load passes loadobj a struct instead of an object

Мои ошибки загрузки происходят из-за установщиков, которые используют свойства, которые еще не был назначен в процессе загрузки. Я хочу определить loadobj метод, который позволяет избежать указанных ошибок и избежать копирования с struct все вместе. Я делаю это, устанавливая свойства в том порядке, в котором они предназначены для установки. Используя шаблон кода из приведенного выше страница в Интернете:

methods(Static)

   function oOut = loadobj(oIn)

      if isstruct( oIn ) % Diagnostic breakpoint set here
         error('Load failed');
      end % if

      % Example code pattern shows input object assigned to output
      % object, but I want to control the order in which
      % properties are assigned to

      oOut.TstepPrYr = oIn.TstepPrYr;
      oOut.TwinYrs = oIn.TwinYrs;
      oOut.Twin1sidePadYrs = oIn.Twin1sidePadYrs;

      % The following properties should have been set by setters
      %     TwinPaddedYrs
      %     TwinPaddedDays
      %     TstepDays
      %     TwinPaddedTsteps % Not used

      % There are also many other properties.  With the key
      % properties set, I should now be able to copy the rest in
      % one shot.

      oOut = oIn;

   end % function

end % methods(Static)

Вверху я ловлю случай, когда входным аргументом является struct. Такое состояние могло бы означают, что загрузка не удалась, когда входным аргументом был добросовестный объект. Я не должен продолжать в этом случае - вместо этого я должен исправить код loadobj.

Поскольку loadobj присваивает значения свойствам в правильном порядке, он никогда не должен выходить из строя, и, следовательно, он никогда не должен вызываться снова с struct аргумент. К сожалению, я все еще ошибаюсь в сеттере из-за несуществующей стоимости недвижимости. Я поставил точку останова вверху loadobj, чтобы увидеть, действительно ли входной аргумент является struct - это так! Так что loadobj, вероятно, даже не вызывается с добросовестным объектом. Я предполагаю, что код загрузки Matlab по умолчанию (и порядок загрузки) вместо этого используется. Согласно верхнему краю loadobj помощь, это не то, что я ожидал.

Может кто-нибудь посоветовать, что я могу сделать для дальнейшего устранения этой проблемы? Если это важно, мой класс является производным от matlab.mixin.Copyable.

Наблюдается странное поведение: если я использую отладчик для продолжения прямо в приведенном выше операторе error, он генерирует предупреждение Matlab вместо ошибки. Но все равно выходит.

Вы реализовали saveobj? load строит ваш объект, а затем вызывает loadobj. Если построение объекта не удается, он вызывает loadobj со структурой. В вашем случае построить объект изначально не удается. Определите saveobj, который выводит структуру с этими тремя полями.

Cris Luengo 17.07.2018 23:18

Я не реализовал saveobj, но, судя по тому, что я читал, в нем нет необходимости для использования loadobj. Чтобы избежать постороннего кода, я просто пытаюсь реализовать loadobj, что (по-видимому) можно сделать, и это не обязательно даже обескураживает. Я думал, что проблема здесь просто в понимании того, как работает loadobj. Вызывается ли он сначала с объектом и вызывается повторно, если это не удается? Тот факт, что примерный шаблон содержит if isstruct..., похоже, подразумевает именно это, и справка по loadobj, похоже, также подразумевает это.

user36800 17.07.2018 23:27

Да, похоже, это именно так. Но если он вызывает вашу функцию с объектом вашего класса, он уже построил его. Зачем тогда нужно его перестраивать? В чем смысл этого loadobj? Учитывая, что ваши объекты не могут быть построены без loadobj, вам придется сделать так, чтобы структура передавалась в loadobj. И вы делаете это, определяя saveobj.

Cris Luengo 18.07.2018 00:08
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
3
121
1

Ответы 1

Я считаю, что вам нужно переместить строку oOut = oIn; в перед, чтобы начать инициализацию свойств. Переменная oOut по умолчанию не инициализируется объектом; он инициализируется структурой, когда вы начинаете присваивать свойства с помощью точечной записи. В качестве альтернативы вы можете инициализировать oOut с помощью вызова конструктора, а затем переместить свойства из oIn.

Наличие строки oOut = oIn; в конце метода loadobj просто устанавливает oOut на неизмененный объект oIn, который был передан, без каких-либо модификаций.

Штопать. Оглядываясь назад, твоя латинская фраза настолько очевидна. Но меня смущает предыдущий абзац. Насколько я понимаю, loadobj сначала вызывает его с сохраненным объектом в качестве входных данных, а если он терпит неудачу, он вызывается снова с версией объекта load. Это не так? В любом случае я столкнулся с загадкой: у меня больше не возникает ошибка. Я пробовал все комбинации structs, clear all, clear functions и перезагружал Matlab, чтобы воссоздать условия.

user36800 17.07.2018 23:56

Хотя вышеперечисленное звучит как хорошо, на самом деле это очень плохо. Это означает, что известная проблема не может возникнуть, поэтому я не могу устранить неполадки. Он поднимет голову, когда я меньше всего могу позволить себе объезд. Я знаю, что будет, потому что причина известна, а я ее не исправил. :(

user36800 17.07.2018 23:57

@ user36800: Я считаю, что этот процесс работает следующим образом: load пытается загрузить данные объекта и построить объект. В случае успеха этот объект передается любому существующему методу loadobj для любой дополнительной настройки (например, восстановления идентификатора файла и т. д.). Если загрузка и построение объекта завершаются неудачно, или если объект был сохранен как структура с помощью процедуры saveobj, структура данных объекта передается в loadobj, чтобы он мог попытаться построить сам объект.

gnovice 18.07.2018 15:56

@ user36800: Что касается вашей проблемы с воссозданием ошибки, возможно, вы изменили определение класса, но не удалили старые объекты класса из рабочей области, что привело к некоторому неопределенному поведению. Если после очистки рабочего пространства он работает правильно, я бы не стал об этом беспокоиться.

gnovice 18.07.2018 15:58

Спасибо за внимание к работе loadobj. Я собираюсь предложить TMW быть более явным на странице документа. Что касается модификации класса, я регулярно делаю снимки всего проекта и могу сравнить текущую базу кода с предыдущими снимками. Я не могу найти никаких различий в коде (все они форматируются и комментируются), которые объясняли бы исчезновение симптомов проблемы. Меня больше беспокоит невозможность устранения неполадок, так как теперь я во власти времени, когда проблема решит повториться. Ну что ж, добро пожаловать в ... реальность, я думаю.

user36800 18.07.2018 17:05

Другие вопросы по теме