gpt4 book ai didi

matlab - 在 MATLAB 中,是否可以在创建新对象之前检查对象是否已存在?

转载 作者:行者123 更新时间:2023-12-02 09:57:44 25 4
gpt4 key购买 nike

我试图弄清楚如何在调用构造函数时询问用户是否要将同一类的先前对象替换为默认对象,或者只是使用先前的对象。

我正在寻找针对这两种情况的操作:

>>obj = Obj()
'obj' already exists. Replace it with default? (y/n): y
%clear obj and call default constructor to create new obj

>>obj = Obj()
'obj' already exists. Replace it with default? (y/n): n
%cancel call of Obj()

我该怎么做?我已经搞乱了默认构造函数,但无济于事。

编辑:如果有什么区别的话,Obj 是 Handle 的子类。

最佳答案

以下解决方案源于多种变通方法/黑客,不是标准 MATLAB 的 OO 构造的一部分。使用时谨慎

您需要:

  1. evalin()'caller' 工作空间中 'base' 工作空间变量的名称和类
  2. 检索last executed command
  3. 提取指定变量的名称,例如regexp()
  4. 比较名称和类。如果发生完全匹配,即 'base' 工作区中的变量被同一类的新实例覆盖,请向用户询问 input()。如果用户选择保留现有对象,请通过 evalin('caller',...) 用现有实例覆盖新实例。

foo:

classdef foo < handle
properties
check = true;
end
methods
function obj = foo()
% variable names and sizes from base workspace
ws = evalin('base','whos');

% Last executed command from window
fid = fopen([prefdir,'\history.m'],'rt');
while ~feof(fid)
lastline = fgetl(fid);
end
fclose(fid);

% Compare names and classes
outname = regexp(lastline,'\<[a-zA-Z]\w*(?=.*?=)','match','once');
if isempty(outname); outname = 'ans'; end

% Check if variables in the workspace have same name
idx = strcmp({ws.name}, outname);
% Ask questions
if any(idx) && strcmp(ws(idx).class, 'foo')
s = input(sprintf(['''%s'' already exists. '...
'Replace it with default? (y/n): '],outname),'s');
% Overwrite new instance with existing one to preserve it
if strcmpi(s,'n')
obj = evalin('caller',outname);
end
end
end
end
end

实际应用中的类:

% create class and change a property from default (true) to false
clear b

b = foo
b =
foo with properties:
check: 1

b.check = false
b =
foo with properties:
check: 0

% Avoid overwriting
b = foo
'b' already exists. Replace it with default? (y/n): n

b
b =
foo with properties:
check: 0

弱点(参见上面的要点):

  • 仅适用于 cmw 行和脚本执行的命令,不适用于函数(请参阅扩展至函数调用的链接)。另外,如果读取 history.m 时出现问题,可能会中断。
  • 当前正则表达式在 a==b 上失败。
  • 很危险,因为 user input 上的 evalin()留下潜在的安全威胁。即使使用正则表达式和字符串比较过滤输入,如果稍后重新访问代码,该构造也可能会出现问题。
  • 关于matlab - 在 MATLAB 中,是否可以在创建新对象之前检查对象是否已存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17554012/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com