【发布时间】:2019-03-22 18:49:24
【问题描述】:
我希望类的构造函数自动确定调用函数的完整路径,以便该类可以编写一个保证在调用者目录中的文件(而不是碰巧是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'
我错过了什么?
【问题讨论】:
-
dbstack 有什么问题?无论如何,如果您直接将此信息传递给班级,那就更好了。这就是争论的重点。
-
有趣!我在这里学到了一些新东西!
-
@MendiBarel
dbstack没有任何错,只是我希望evalin表现得不同......有点上下文:我正在写类似的东西到 Python 中的pickle:一个自动且完全透明地将某些需要很长时间计算的变量缓冲到文件的类。对于这类事情,您不想打扰用户默认提供路径信息;该文件最直观的路径应该只是 默认值。eval*有合法用例 ????
标签: matlab oop constructor eval