我想弄清楚如何询问用户是否要使用默认对象,以取代同一类的一个对象,或者简单地调用构造函数时,使用以前的对象。
我正在寻找在这两种情况下操作:
>>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是柄的子类。
下面的解决方案从几个解决方法/黑客茎和不标准的MATLAB的面向对象的构造的一部分。 请谨慎使用。
你需要:
-
evalin()
到'caller'
工作空间中的名称和类'base'
workpsace变量 - 检索最后执行的命令
- 提取与例如所分配的变量的名称
regexp()
- 比较名称和类。 如果发生匹配总,即,在该变量
'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
。 - 危险的,因为
evalin()
对用户输入留下潜在的安全威胁开放。 即使输入过滤用正则表达式和字符串比较,如果代码重新后来就结构可能会造成问题。
独生子
试试这个,不知道你是否熟悉,但是这意味着,你只能拥有这特定对象的全局实例。
你可以使用的功能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?