2014-09-23 19 views
5

Próbuję dowiedzieć się w czasie wykonywania, czy moja funkcja zastępuje inną funkcję.Sprawdzanie, czy moja funkcja zastępuje inną funkcję

Rozważmy następujący hipotetyczny scenariusz. Wdrażam funkcjonalność o nazwie freqz, która może istnieć w środowisku MATLAB, jeśli zainstalowano zestaw narzędzi do przetwarzania sygnału. Jeśli rzeczywiście istnieje już jako część zestawu narzędzi, chcę go nazwać w moim własnym i zwrócić jego wynik. Jeśli nie istnieje, chciałbym, aby moja własna funkcja wykonywała własne przetwarzanie.

Oto pseudokod próbka

function foo(args) 
    if overrides_another_function(foo) 
     func = find_overriden_function(foo); 
     result = func(args); 
    else 
     result = my_own_processing(args); 

    return result; 

W tym przypadku, gdy ktoś dzwoni foo, dostaną wersję oni spodziewać, i polegać na własnej implementacji jeśli foo jest niedostępne z zewnątrz. Czy MATLAB jest w stanie zrobić coś takiego?

Co próbowałem:

  • Wywołanie exist zasięgu foo zawsze zwraca 2 (funkcja istnieje), ponieważ funkcja jest uważana oświadczył raz jesteśmy wewnątrz niej po raz pierwszy.
  • Uruchamianie exist spoza funkcji w m-pliku jest niepoprawna składnia MATLAB.
  • Nie znalazłem sposobu na wylistowanie wszystkich funkcji o podanej nazwie. Jeśli uda się to osiągnąć, dotarłoby to do mnie w połowie drogi (przynajmniej wiedziałbym o istnieniu, ale nadal potrzebowałbym dowiedzieć się, jak uzyskać dostęp do zastąpionej funkcji).
+0

można utworzyć podfoldery w obszarze roboczym zawierające "swoje" funkcji. Na początku powinny one być nieznane twojej głównej funkcji, abyś mógł sprawdzić, czy istnieje oryginalna funkcja ('co' itp.) - jeśli wynik jest pusty, możesz użyć' addpath', aby dodać folder z twoją niestandardową funkcją. Istnieją prawdopodobnie bardziej eleganckie sposoby programowania obiektowego. Ale nie jestem tego obeznany. – thewaywewalk

+0

Czy któreś z podanych tutaj rozwiązań działa prawidłowo? – Divakar

Odpowiedz

0

Tylko dwie sugestie, a nie prawdziwa odpowiedź.

Może poprzez znalezienie skryptu przez nazwę (która foo) http://www.mathworks.nl/help/matlab/ref/which.html ale prawdopodobnie również wskazuje na foo jesteś już w.

W przeciwnym razie trzeba by szukać pełną ścieżkę do wystąpień foo .

2

Dzwoniąc pod numer which można uzyskać pełną ścieżkę dowolnej funkcji. Zakładając, że nie należy umieszczać żadnych funkcji niestandardowych wewnątrz folderów nazwanych toolbox, to wydaje się działać całkiem dobrze:

x = which('abs', '-all'); %// Returns a cell array with all the full path 
          %// functions called abs in order of precedence 

Teraz, aby sprawdzić, czy któryś z nich znajdują się w jednej z zainstalowanych przyborniki:

in_toolbox = any(cellfun(@(c) any(findstr('toolbox',c)), x)); 

To się zwróci, jeśli funkcja 'abs' już istnieje w jednej z twoich skrzynek narzędziowych, a 0, jeśli nie. Stamtąd myślę, że powinno być możliwe uniknięcie używania własnego, stworzonego na zamówienie.

Możesz także sprawdzić na 'built-in' w findstr, ale niektóre funkcje z przyborników nie mają tego przed nazwą.

0

Kod funkcji

function result = feval1(function_name,args) 

%// Get the function filename by appending the extension - '.m' 
relative_filename = strcat(function_name,'.m'); 

%// Get all possible paths to such a function with .m extension 
pospaths = strcat(strsplit(path,';'),filesep,relative_filename); 

%// All paths that have such function file(s) 
existing_paths = pospaths(cellfun(@(x) exist(x,'file'),pospaths)>0); 

%// Find logical indices for toolbox paths(if this function is a built-in one) 
istoolbox_path = cellfun(@(x) strncmp(x,matlabroot,numel(matlabroot)),existing_paths); 

%// Find the first toolbox and nontoolbox paths that have such a function file 
first_toolbox_path = existing_paths(find(istoolbox_path,1,'first')); 
first_nontoolbox_path = existing_paths(find(~istoolbox_path,1,'first')); 

%// After deciding whether to use a toolbox function with the same function name 
%// (if available) or the one in the current directory, create a function handle 
%// based on the absolute path to the location of the function file 
if ~isempty(first_toolbox_path) 
    func = function_handle(first_toolbox_path); 
    result = feval(func,args); 
else 
    func = function_handle(first_nontoolbox_path); 
    result = feval(func,args); 
end 

return; 

Zwróć uwagę powyższy kod funkcja wykorzystuje kod FEX nazwie function handle, które można uzyskać z here.

użycie Sample -

function_name = 'freqz';    %// sample function name 
args = fircls1(54,0.3,0.02,0.008); %// sample input arguments to the sample function 
result = feval1(function_name,args) %// output from function operation on input args 
Powiązane problemy