【问题标题】:access data returned from a method of a class in other methods在其他方法中访问从类的方法返回的数据
【发布时间】:2021-08-24 09:13:59
【问题描述】:

我有以下课程

classdef setting
        
    properties(Constant)
        n = setting.get_n;
        q = setting.get_q;
    end
    
    methods(Static)
        function data = load_setting
            File = 'Configuration.ini';
            I = INI('File',File);
            I.read();
            data = I.get('UserData'); % struct
        end
        
        function n = get_n
            data = setting.load_setting;
            n = data.m + 2;
        end

        function q = get_q
            data = setting.load_setting;
            temp = data.q;
            q           = fieldnames(temp);        
        end
    end
end

我想知道是否可以在类中定义的其余方法中自动访问load_setting 返回的data,而不是在每个方法中调用data = load_setting 。建议会很有帮助。

【问题讨论】:

  • data 是否更新了多次?如果没有,您可以在类构造函数中移动 load_setting 调用
  • 如果数据不变,您甚至可以将data 设为静态变量并重复使用它,而不是每次需要时都读取它。
  • @CrisLuengo 是的,数据不会改变。你能举个例子吗?我不确定我是否了解如何将data 设置为静态变量
  • @MatteoV 感谢您的建议。你能告诉我怎么做吗?

标签: matlab class methods


【解决方案1】:

常量通常由 MATLAB 中的函数提供。例如,pi 是一个函数。提供从文件中读取的常量数据的函数可以这样编写,使用关键字persistent(代码未测试):

function data = config_data
   persistent data;
   if isempty(data)
      File = 'Configuration.ini';
      I = INI('File',File);
      I.read();
      data = I.get('UserData');
   end
end

现在你第一次使用config_data,它会加载数据。随后的时间它将立即返回数据结构。在最新版本的 MATLAB 中,您可以对函数的返回值使用点索引,因此您可以执行 config_data().m 或 config_data().q 并从数据中获取相关字段。上面的函数可以进一步处理数据以获得在静态类方法中计算的q 和n 值,因此您不需要来自setting 类的任何内容,只要所有数据都是静态的.

如果您需要将常量数据作为类而不是函数(动态计算值或使用输入值的静态方法),我会将上述内容作为静态函数 load_setting 插入到您的类中,因为导致工作量最少。

【讨论】:

    【解决方案2】:

    有一种方法可以创建一个可以更改的常量属性!它通过类组成。 首先你应该定义一个引用(句柄)类型的数据类:

    classdef dataclass<handle
        properties
            m=3;
            n=4;
        end
    end
    

    然后在您的设置类中创建一个常量数据属性:

    classdef setting
        properties (Constant)
            data=dataclass()
        end
        methods (Static)
            function somefunc()
                a=setting();
                a.data.n=1;
                a.data.m=2;
            end
            function out=showdata()
                out=setting.data;
            end
        end
    end
    

    这样你就有一个对数据的恒定引用,当你调用 A.somefunc() 时,你可以在所有类和该类的所有对象中更改它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-18
      • 2014-09-05
      • 2010-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多