代码之家  ›  专栏  ›  技术社区  ›  Rody Oldenhuis

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

  •  1
  • Rody Oldenhuis  · 技术社区  · 7 年前

    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', ...)

    筑巢 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'
    

    我错过了什么?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Cris Luengo    7 年前

    evelin 为此目的。从 the documentation :

    evalin('caller', expression) 仅查找 变量 功能 打电话的人。

    从中我了解到,在计算表达式之前并没有恢复调用函数的完整上下文,只有调用函数的工作区中的变量可用。

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

    evalin 不能递归地用于计算表达式。例如,表单的序列 evalin('caller', 'evalin(''caller'', ''x'')')

    这与只有调用者的工作区可用,而不是整个上下文的概念是一致的。表达式的计算实际上并不像是在调用函数中编写的那样。

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

    这个 dbstack 选择才是出路。