2014-02-06 2 views
1

Я хочу ООП, как интерфейс с Matlab, таким образом, что у меня есть что-то вродеСтатическое свойство в Matlab

classdef Foo 
properties (Constant) 
    dict = NaN; 
end 
methods (Static) 
    function list = search(varargin) 
    %... 
    Foo.dict = cell(10,5); % etc.. 
    end 
end 
end 

Таким образом я могу получить доступ и изменить свойство (статический). Как мне его установить? Не Constant я думаю ..

Update: Моя проблема заключается в том, что t9.load(); не обновляет t9.dict

classdef t9 
    %T9 Summary of this class goes here 
    % Detailed explanation goes here 

    properties% (Static) 
     dict = {}; 
    end 

    methods (Static) 
     function load() 
      load('usdict.mat'); 
      t9.dict = usdict; 
     end 
     function matches = search(varargin) 
      matches = {}; 
      num_words = nargin-1; 
      for word=t9.dict(num_words, :) 
       if strcmp(word,'') 
        continue; 
       end 
       word_cell = word{1}; 
       success = true; 
       for i=1:num_words 
        char = word_cell(i); 
        if ~ismember(char, varargin{i}) 
         success = false; 
        end 
       end 
       if success, matches{end+1} = word_cell; end 
      end 
     end 
    end 

end 

Пожелания:

t9.load(); 
t9.search('ABC', 'DEF'); 
t9.search('DEF', 'GHI', 'MNO'); 
+0

'Static'' методы' - это методы, которые могут запускаться без экземпляра класса; они могут ссылаться только на 'constant'' properties'. Для установки 'свойства' класса требуется экземпляр этого класса. Таким образом, казалось бы, ваш 'метод' не должен быть' static'. –

+0

@RodyOldenhuis Посмотрите мой обновленный код. –

+0

Прошу прощения, но это звучит так, как будто вы создаете [спагетти с фрикадельками] (http://en.wikipedia.org/wiki/Spaghetti_code#Spaghetti_with_meatballs) здесь ... –

ответ

1

Если вы никогда не собираетесь добавить в словарь, то самое простое - загрузить словарь как свойство константы.

classdef t9 
    properties (Constant) 
     dict = i_loadDict() 
    end 
    ... 
end 

function out = i_loadDict() 
    load('usdict.mat'); 
    out = usdict; 
end 

Есть способы сделать что-то обновляемое, но это самое простое решение вашей проблемы.

+0

Вы, сэр, потрясающие. Спасибо. –

1

Я действительно не понимаю, почему вы хотите, чтобы избежать необходимости экземпляр ... почему бы не использовать это:

T = t9; 
T.load(); %// taken care of by constructor? 

T.search('ABC', 'DEF'); 
T.search('DEF', 'GHI', 'MNO'); 

clear T 

вместо вашей лист желаний? classdef:

classdef t9 
    %T9 Summary of this class goes here 
    % Detailed explanation goes here 

    properties 
     dict = {}; 
    end 

    methods %// note: NOT static 

     function load(obj) 
      load('usdict.mat'); 
      obj.dict = usdict; 
     end 

     function matches = search(obj, varargin) 
      matches = {}; 
      num_words = nargin-1; 
      for word=obj.dict(num_words, :) 
       if strcmp(word,'') 
        continue; 
       end 
       word_cell = word{1}; 
       success = true; 
       for i=1:num_words 
        char = word_cell(i); 
        if ~ismember(char, varargin{i}) 
         success = false; 
        end 
       end 
       if success, matches{end+1} = word_cell; end 
      end 
     end 
    end 

end 
+0

Потому что я буду использовать его из нескольких n разных сценариев, и я не хочу создавать его несколько раз. –

+0

@ c.jespersen: Почему бы не создать один экземпляр и передать его всем скриптам? Вы можете настроить словарь в соответствии с вашими потребностями, как показано в Мэтт. Если вы собираетесь использовать ориентацию объектов, используйте * objects *. В противном случае просто используйте функцию. –

+0

Поскольку решения, которые были предоставлены NZbuu и Matt J, более умны и проще, чем передавать экземпляр везде, где мне нужно его использовать :-) –

2

Я хотел бы сохранить dict в качестве зависимого свойства и иметь его ссылаться на постоянную переменную, содержащую статические данные, как показано ниже. При этом вы можете обновить dict, используя либо конструктор, либо установив его напрямую с помощью экземпляра объекта. Все экземпляры будут использовать любое значение, которое вы ему даете, даже если оно загружено из файла .mat.

classdef myclass 

properties (Dependent) 
    dict 
end 

methods 

    function obj=set.dict(obj,val) 

      manageDict('set',val); 

    end 

    function val=get.dict(obj) 

     val=manageDict('get'); 

    end 

    function obj=myclass(dict) 

     obj.dict=dict; 


    end 

end 

end 


function varargout=manageDict(op,newdict) 

    persistent dictStatic; 

    switch op 

     case 'get' 

      varargout{1}=dictStatic; 

     case 'set'  

      dictStatic=newdict; 

    end 


end 
Смежные вопросы