【问题标题】:Why does MATLAB throw an "undefined variable" error when I try to assign a class property to another class property in the properties block?为什么当我尝试将类属性分配给属性块中的另一个类属性时,MATLAB 会抛出“未定义变量”错误?
【发布时间】:2013-12-07 22:13:54
【问题描述】:

如果我运行这段代码来创建一个简单的类:

classdef myclass
    properties
        m = 2;
        n = m + 2;
    end
end

我收到一个错误:

Undefined function or variable 'm'.
Error in myclass (line 1)
classdef myclass 

这是为什么?我在这个最小示例中省略了构造函数,因为 a) 如果我将构造函数放入,错误仍然存​​在,并且 b) 我在单元测试类中遇到此错误,并且在 MATLAB 2013b 中的此类类中未调用构造函数。

【问题讨论】:

    标签: matlab matlab-class


    【解决方案1】:

    this page 上有一个注释可以解释问题:

    注意:属性默认值的评估仅在首次需要该值时进行,并且仅在 MATLAB 首次初始化类时进行一次。 MATLAB 不会在您每次创建类实例时重新计算表达式。

    我认为这意味着当您创建一个类实例时,m 尚未初始化,因此您不能使用它为另一个属性 n 设置默认值。

    我可以让它工作的唯一方法是如果我将m 声明为常量属性:

    classdef myclass
        properties (Constant = true)
           m=2; 
        end
        properties
            n = myclass.m + 2;
        end
    end
    

    但如果您想更改 m,这可能无济于事。

    【讨论】:

    • 这实际上工作得很好,因为我不需要在我的单元测试框架中更改m。谢谢!
    【解决方案2】:

    MATLAB 将属性定义为 classname.propertyname。因此,如果您将代码更改为以下内容,它应该可以工作。

    classdef myclass
        properties
            m = 2;
            n = myclass.m + 2;
        end
    end
    

    亲切的问候,

    【讨论】:

    • 你测试过这个吗?它不起作用。查看其他解决方案;你需要Constant 属性。
    • 嗯,是的,我通过复制粘贴到 MATLAB R2013a 来做到这一点。
    • 我补充说我使用的是 2013b 版本,因为该代码在该版本中不起作用。
    【解决方案3】:

    您也可以将初始化移至构造函数:

    classdef myclass
        properties
            m = 2;
            n;
        end
        methods
            function obj = myclass(obj)
                obj.n = obj.m + 2;
            end
        end
    end
    

    【讨论】:

    • 我认为这可能是一个更好的解决方案,因为它允许您在将来更改 m。
    猜你喜欢
    • 2015-07-16
    • 1970-01-01
    • 2021-12-02
    • 2017-01-16
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多