获取调用构造函数的函数的完整路径

Getting the full path of the function calling the constructor

我希望 class 的构造函数能够自动确定调用函数的完整路径,以便 class 可以编写一个保证位于调用者目录中的文件 (而不是 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? 

我预计 evalin('caller', ...) 中对 mfilename() 的调用会在 test() 内部进行计算,但显然,这并没有发生...

嵌套 evalins 似乎没有帮助:

...
function obj = SomeClass()            
    evalin('caller', ' evalin(''caller'', ''mfilename(''''fullpath'''')'') ')
end
...

>> test()
ans = 
    'some_path/some_subdir/SomeClass.m'

让这个工作的唯一方法是远不直观 dbstack()

...
function obj = SomeClass()            
    S = dbstack(1, '-completenames');
    S(1).file            
end
...

>> test()
ans = 
    'some_path/test.m'

我错过了什么?

看起来您不能使用 evelin 来达到这个目的。来自 the documentation:

evalin('caller', expression) finds only variables in the caller's workspace; it does not find functions in the caller.

据我所知,在计算表达式之前,调用函数的完整上下文并未恢复,只有调用函数工作区中的变量可用。

同一个文档页面也提到了这个限制:

evalin cannot be used recursively to evaluate an expression. For example, a sequence of the form evalin('caller', 'evalin(''caller'', ''x'')') doesn't work.

这与只有调用者的工作区可用而不是完整上下文的概念一致。表达式实际上并没有被评估,就好像它是在调用函数中写的一样。

我用一个简单的 M 文件函数重复了您的实验,只是为了验证这确实不是特定于 类 或构造函数,而是通常适用于任何地方的任何函数。

dbstack 选项是正确的选择。