Matlab App加载函数问题:如何通过变量引用修改其属性
解决MATLAB App属性加载的问题
嘿,我懂你现在卡在哪了——你想把之前保存的属性值重新赋值给App里对应的属性,但当前的代码只是在修改loadlist这个字符串数组里的内容,完全没触碰到实际的App对象属性对吧?咱们来一步步解决这个问题。
为什么你的现有代码不生效?
你这段循环代码:
for(n=1:length(loadlist)) loadlist(1,n)=savelist(1,n); end
本质上只是把loadlist里的字符串替换成了savelist里的内容,根本没有对app.starting_height这类实际属性做任何修改。因为loadlist里存的只是属性的名称字符串,不是指向属性的引用,直接修改字符串当然不会改变App的属性值。
正确的解决方案
下面给你几种靠谱的实现方式,按推荐程度排序:
1. 用setfield安全修改属性(推荐)
setfield函数可以根据属性名称的字符串,直接设置对象的属性值,比用eval更安全(避免了字符串执行的潜在风险)。
首先把属性名称整理成单元格数组(比字符数组更灵活),然后循环赋值:
% 定义要加载的属性名称列表(只写属性名,不用带app.前缀) propNames = {'starting_height', 'dragenabled', 'heading'}; % 假设savelist是你之前保存的属性值数组,顺序和propNames完全对应 for i = 1:length(propNames) % 用setfield直接修改app的对应属性 app = setfield(app, propNames{i}, savelist(i)); end
2. 用eval快速实现(谨慎使用)
如果你坚持想用原来的完整属性路径字符串(比如'app.starting_height'),可以用eval来执行赋值语句,但要注意如果savelist的内容不可控,可能会有安全隐患:
% 把loadlist改成单元格数组,每个元素是完整的属性路径 loadlist = {'app.starting_height','app.dragenabled','app.heading'}; for n = 1:length(loadlist) % 构造赋值语句并执行 eval([loadlist{n}, ' = savelist(n);']); end
3. 更优雅的结构体保存/加载(最佳实践)
其实最好的方式是保存时把属性打包成结构体,加载时直接映射,这样不用手动维护两个列表,不容易出错:
- 保存时:
% 把需要保存的属性打包进结构体 saveData.starting_height = app.starting_height; saveData.dragenabled = app.dragenabled; saveData.heading = app.heading; % 保存到mat文件 save('appSettings.mat', 'saveData');
- 加载时:
% 加载保存的结构体 loadedData = load('appSettings.mat'); % 循环遍历结构体字段,赋值给app属性 fields = fieldnames(loadedData.saveData); for i = 1:length(fields) app = setfield(app, fields{i}, loadedData.saveData.(fields{i})); end
这样不管你后续增加或减少属性,只要修改保存时的结构体就行,不用再调整加载的列表,维护起来轻松很多。
内容的提问来源于stack exchange,提问作者John Wyllie
相关产品推荐
相关产品推荐

