【发布时间】:2018-12-25 16:20:26
【问题描述】:
我最初涉足loadobj:我找到了code pattern and explanation:
如果
load函数遇到错误,load将传递loadobjstruct而不是对象
我的加载错误来自使用尚未使用的属性的设置器
在加载过程中被分配。我想定义一个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 参数。不幸的是,我仍然在 setter 中出错
由于不存在的属性值。我在顶部放了一个断点
的loadobj,看看输入参数是否确实是struct——它是!
所以loadobj 可能甚至没有被一个真正的对象调用。
我猜想 Matlab 的默认加载代码(和加载顺序)是
被使用。根据loadobj
help的顶部,这是
不是我所期望的。
有人可以建议我可以做些什么来进一步解决这个问题吗?
以防万一,我的课程源自matlab.mixin.Copyable。
观察到的奇怪行为:如果我使用调试器继续执行上述 error 语句,它会生成 Matlab 警告而不是错误。但它仍然存在。
【问题讨论】:
-
你实现
saveobj了吗?load构建您的对象,然后调用loadobj。如果构建对象失败,它会使用结构调用loadobj。在您的情况下,构建对象最初会失败。定义一个saveobj,它输出一个包含这三个字段的结构。 -
我还没有实现
saveobj,但根据我的阅读,使用loadobj应该没有必要。为了避免多余的代码,我只是尝试实现loadobj,这(显然)可以完成,甚至不一定会气馁。我认为这里的问题只是了解loadobj的工作原理。它是否首先用对象调用,如果失败则重新调用?示例模式包含if isstruct...的事实似乎正是暗示了这一点,loadobj帮助似乎也暗示了这一点。 -
是的,它看起来就是这样做的。但是如果它用你的类的对象调用你的函数,它已经构造了它。那你为什么需要重新构建它呢?这个
loadobj有什么意义?鉴于没有loadobj,您的对象无法构建,您必须将结构传递给loadobj。你可以通过定义一个saveobj来做到这一点。