我最初涉足loadobj
:我发现了code pattern and explanation:
如果
load
函数遇到错误,则load
向loadobj
传递struct
而不是对象
我的加载错误来自使用尚未使用的属性的设置器
已在加载过程中分配给。我想定义一个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的默认加载代码(和加载顺序)是
被代替使用。根据{{3}}的顶部,这是
不是我应该期望的。
有人可以建议我可以做些什么来进一步解决此问题吗?
万一重要,我的课程是从matlab.mixin.Copyable
派生的。
观察到奇怪的行为:如果我使用调试器直接继续执行上述error
语句,它将生成Matlab警告而不是错误。但是它仍然存在。
答案 0 :(得分:0)
我相信您需要在开始初始化属性之前将行oOut = oIn;
移到 。默认情况下,变量oOut
未初始化为对象;当您开始使用点表示法分配属性时,它将初始化为结构。另外,您可以通过调用构造函数来初始化oOut
,然后从oIn
移动属性。
在oOut = oIn;
方法的末尾加上loadobj
行,只需将oOut
设置为传递的未更改的oIn
对象,无需进行任何修改。