Мне бы хотелось, чтобы конструктор класса автоматически определял полный путь к вызывающей функции, чтобы этот класс мог записать файл, который гарантированно будет находиться в каталоге вызывающей стороны (вместо того, что случается с 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()
:
...
function obj = SomeClass()
S = dbstack(1, '-completenames');
S(1).file
end
...
>> test()
ans =
'some_path/test.m'
Что мне не хватает?