获取调用构造函数的函数的完整路径
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
选项是正确的选择。
我希望 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 formevalin('caller', 'evalin(''caller'', ''x'')')
doesn't work.
这与只有调用者的工作区可用而不是完整上下文的概念一致。表达式实际上并没有被评估,就好像它是在调用函数中写的一样。
我用一个简单的 M 文件函数重复了您的实验,只是为了验证这确实不是特定于 类 或构造函数,而是通常适用于任何地方的任何函数。
dbstack
选项是正确的选择。