用于evalc
获取文件名变量
假设您正在save
使用函数式语法进行调用。例如,
tt = timer; % for timer/saveobj overloaded method
fname = 'test.mat'; varname = 'tt';
save(fname,varname)
在saveobj
中,用于evalin
获取fname
变量。为了快速测试上面的例子,在第一行设置断点timer\saveobj
,
>> dbstop in timer\saveobj
>> save(fname,varname)
23 if isvalid(obj)
K>> fname = evalin('caller','fname')
fname =
timertest.mat
K>>
由于save
是内置命令,因此没有单独的堆栈save
,并且调用者saveobj
将是运行该save
命令的任何人。在此示例中,它是基本工作区:
K>> dbstack
> In timer.saveobj at 23
K>> dbup
In base workspace.
K>> dbdown
In workspace belonging to timer.saveobj at 23
fname
如果是完整的文件名,我很确定您知道如何获取路径,但为了完整起见,
filePath = fileparts(fname) % empty when no path specified
使用dbstack
anddbtype
解析save
命令
此方法仅在您从脚本调用时才有效-如果在命令行上(在基本工作区中)键入save
它将不起作用。save
但是,它不需要文件名在变量中。
以下代码将进入您的saveobj
方法:
[st,I]=dbstack('-completenames');
fname = regexp(evalc('dbtype(st(2).file,num2str(st(2).line))'),...
'(?<=save\()(\S*)(?=,)','match','once');
例如,如果我们的测试脚本现在使用save
临时文字,
>> dbstop in timer\saveobj
>> save('C:\timertest.mat',varname)
23 if isvalid(obj)
K>> st = dbstack('-completenames');
K>> fname = regexp(evalc('dbtype(st(2).file,num2str(st(2).line))'),'(?<=save\()(\S*)(?=,)','match','once')
fname =
'C:\timertest.mat'
你得到了一个字符串中的文件名,你得到了像以前一样的路径fileparts
。