在MATLAB中,是否有可能检查的对象创建一个新的人之前已经存在?(In MATLAB, is it

2019-10-18 08:39发布

我想弄清楚如何询问用户是否要使用默认对象,以取代同一类的一个对象,或者简单地调用构造函数时,使用以前的对象。

我正在寻找在这两种情况下操作:

>>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是柄的子类。

Answer 1:

下面的解决方案从几个解决方法/黑客茎和不标准的MATLAB的面向对象的构造的一部分。 请谨慎使用。

你需要:

  1. evalin()'caller'工作空间中的名称和类'base' workpsace变量
  2. 检索最后执行的命令
  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

弱点 (见上分):

  1. 仅适用于CMW线和脚本执行的命令,而不是功能(参见链路延伸到函数调用)。 此外,可能会打破的问题,阅读history.m情况。
  2. 当前的正则表达式上失败a==b
  3. 危险的,因为evalin()对用户输入留下潜在的安全威胁开放。 即使输入过滤用正则表达式和字符串比较,如果代码重新后来就结构可能会造成问题。


Answer 2:

独生子

试试这个,不知道你是否熟悉,但是这意味着,你只能拥有这特定对象的全局实例。



Answer 3:

你可以使用的功能isobject()见文件在这里 ),以检查是否变量是一个对象。 如果为真,然后你可以检查类与对象的class()见文档在这里 ),并将其与类要构建的对象。 喜欢的东西(只给你一个想法):

if isobject(obj)
    if class(obj) == myclass
        % ask to replace it or not
    else
        % create new one over the object of a different class
    end
else
    % create new one
end

如果我没有理解你的问题,你可能希望把这个作为你的类的构造函数。 我想你会调用构造函数时,传递变量名: obj = Obj(obj)



文章来源: In MATLAB, is it possible to check if an object already exists before creating a new one?