我希望类的构造函数自动确定调用函数的完整路径,以便该类可以写一个保证位于调用者目录中的文件(而不是{{1 }}。
所以,我有以下设置:
在pwd()
中:
some_path/test.m
在function test
SomeClass()
end
中:
some_path/some_subdir/SomeClass.m
致电classdef SomeClass < handle
methods
function obj = SomeClass()
evalin('caller', 'mfilename(''fullpath'')')
end
end
end
时,我得到以下信息:
test()
我希望在>> test()
ans =
'some_path/some_subdir/SomeClass.m' % <- ...why?
中调用mfilename()
中的evalin('caller', ...)
,但是显然不会发生...
嵌套test()
似乎无济于事:
evalins
使此功能生效的唯一方法是远不那么直观的...
function obj = SomeClass()
evalin('caller', ' evalin(''caller'', ''mfilename(''''fullpath'''')'') ')
end
...
>> test()
ans =
'some_path/some_subdir/SomeClass.m'
:
dbstack()
我想念什么?
答案 0 :(得分:1)
您似乎不能为此目的使用evelin
。来自the documentation:
evalin('caller', expression)
在调用者的工作区中仅找到变量;它在调用方中找不到功能。
据我了解,在评估表达式之前未恢复调用函数的完整上下文,只有调用函数工作区中的变量才可用。
同一文档页面也提到了此限制:
evalin
不能递归用于评估表达式。例如,格式为evalin('caller', 'evalin(''caller'', ''x'')')
的序列不起作用。
这与仅调用者的工作空间可用而不是整个上下文可用的观念是一致的。表达式实际上并没有像在调用函数中那样编写。
我已经用一个简单的M文件功能重复了您的实验,只是为了证明这确实不是特定于类或构造函数的,而是通常适用于任何地方的任何函数。
dbstack
选项是解决之道。