Мой первый набег на loadobj: я нашел шаблон кода и объяснение:
If the
loadfunction encounters an error,loadpassesloadobjastructinstead 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, но, судя по тому, что я читал, в нем нет необходимости для использования loadobj. Чтобы избежать постороннего кода, я просто пытаюсь реализовать loadobj, что (по-видимому) можно сделать, и это не обязательно даже обескураживает. Я думал, что проблема здесь просто в понимании того, как работает loadobj. Вызывается ли он сначала с объектом и вызывается повторно, если это не удается? Тот факт, что примерный шаблон содержит if isstruct..., похоже, подразумевает именно это, и справка по loadobj, похоже, также подразумевает это.
Да, похоже, это именно так. Но если он вызывает вашу функцию с объектом вашего класса, он уже построил его. Зачем тогда нужно его перестраивать? В чем смысл этого loadobj? Учитывая, что ваши объекты не могут быть построены без loadobj, вам придется сделать так, чтобы структура передавалась в loadobj. И вы делаете это, определяя saveobj.





Я считаю, что вам нужно переместить строку oOut = oIn; в перед, чтобы начать инициализацию свойств. Переменная oOut по умолчанию не инициализируется объектом; он инициализируется структурой, когда вы начинаете присваивать свойства с помощью точечной записи. В качестве альтернативы вы можете инициализировать oOut с помощью вызова конструктора, а затем переместить свойства из oIn.
Наличие строки oOut = oIn; в конце метода loadobj просто устанавливает oOut на неизмененный объект oIn, который был передан, без каких-либо модификаций.
Штопать. Оглядываясь назад, твоя латинская фраза настолько очевидна. Но меня смущает предыдущий абзац. Насколько я понимаю, loadobj сначала вызывает его с сохраненным объектом в качестве входных данных, а если он терпит неудачу, он вызывается снова с версией объекта load. Это не так? В любом случае я столкнулся с загадкой: у меня больше не возникает ошибка. Я пробовал все комбинации structs, clear all, clear functions и перезагружал Matlab, чтобы воссоздать условия.
Хотя вышеперечисленное звучит как хорошо, на самом деле это очень плохо. Это означает, что известная проблема не может возникнуть, поэтому я не могу устранить неполадки. Он поднимет голову, когда я меньше всего могу позволить себе объезд. Я знаю, что будет, потому что причина известна, а я ее не исправил. :(
@ user36800: Я считаю, что этот процесс работает следующим образом: load пытается загрузить данные объекта и построить объект. В случае успеха этот объект передается любому существующему методу loadobj для любой дополнительной настройки (например, восстановления идентификатора файла и т. д.). Если загрузка и построение объекта завершаются неудачно, или если объект был сохранен как структура с помощью процедуры saveobj, структура данных объекта передается в loadobj, чтобы он мог попытаться построить сам объект.
@ user36800: Что касается вашей проблемы с воссозданием ошибки, возможно, вы изменили определение класса, но не удалили старые объекты класса из рабочей области, что привело к некоторому неопределенному поведению. Если после очистки рабочего пространства он работает правильно, я бы не стал об этом беспокоиться.
Спасибо за внимание к работе loadobj. Я собираюсь предложить TMW быть более явным на странице документа. Что касается модификации класса, я регулярно делаю снимки всего проекта и могу сравнить текущую базу кода с предыдущими снимками. Я не могу найти никаких различий в коде (все они форматируются и комментируются), которые объясняли бы исчезновение симптомов проблемы. Меня больше беспокоит невозможность устранения неполадок, так как теперь я во власти времени, когда проблема решит повториться. Ну что ж, добро пожаловать в ... реальность, я думаю.
Вы реализовали
saveobj?loadстроит ваш объект, а затем вызываетloadobj. Если построение объекта не удается, он вызываетloadobjсо структурой. В вашем случае построить объект изначально не удается. Определитеsaveobj, который выводит структуру с этими тремя полями.