【问题标题】:Static property in MatlabMatlab中的静态属性
【发布时间】:2014-03-03 13:22:53
【问题描述】:

我想要一个类似于 Matlab 的 OOP 接口,在某种程度上我有类似的东西

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

所以我可以访问和修改(静态)属性。我应该如何设置它?不是Constant 我猜..

更新: 我的问题是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');

【问题讨论】:

  • Static methods 是可以在没有类实例的情况下运行的方法;他们只能参考constantproperties。设置类的property 需要该类的实例。因此,您的 method 似乎不应该是 static
  • @RodyOldenhuis 看看我更新的代码。
  • 很抱歉,但在我看来,您在此处创建 spaghetti with meatballs...
  • 您可以使用Constant 属性来执行此操作,如果它指向一个类的实例,该实例在属性部分中初始化并因此在您的 t9 实例之间共享。在这里查看我对这个问题的回答:stackoverflow.com/a/33922082/942179

标签: matlab oop properties static matlab-class


【解决方案1】:

我会将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

【讨论】:

    【解决方案2】:

    我真的不明白你为什么要避免拥有一个实例...为什么不使用这个:

    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
    

    【讨论】:

    • 因为我会从几个 n 不同的脚本中使用它,我不想实例化它几次。
    • @c.jespersen:为什么不创建一个实例并将其传递给所有脚本呢?您可以调整字典以满足您的需要,如 Matt 所示。如果要使用面向对象,请使用 objects。否则,只需使用一个函数。
    • 因为 NZbuu 和 Matt J 提供的解决方案比在我需要使用它的任何地方传递实例更智能、更容易:-)
    • “更容易”:是的。 "smarter": ...我会在几个月后再问你:)
    • 为什么不应该更智能?现在我知道我可以随时使用 t9.search() 访问它。
    【解决方案3】:

    如果您永远不会添加到字典中,那么最简单的做法是将字典加载为常量属性。

    classdef t9
        properties (Constant)
            dict = i_loadDict()
        end
        ...
    end
    
    function out = i_loadDict()
        load('usdict.mat');
        out = usdict;
    end
    

    有一些方法可以更新,但这是解决问题的最简单方法。

    【讨论】:

      猜你喜欢
      • 2018-04-18
      • 1970-01-01
      • 2014-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-11
      相关资源
      最近更新 更多