【问题标题】:why do properties not take on a new value from class method? [duplicate]为什么属性不从类方法中获取新值? [复制]
【发布时间】:2011-12-26 13:41:49
【问题描述】:

我正在尝试更多地了解 Matlab 类及其属性。这是我创建的一个测试类:

classdef Test    
    properties
         % Properties of the network type
        some_var
    end

    methods
         function N = Test()
         end

        function change_var( N, val )
             N.some_var=val;
        end
    end
end

现在,我创建这个类的一个实例,并调用“change_var()”...

>> a=Test;
>> a.change_var(2);
>> a.some_var

ans =

     []

为什么赋值中的属性“some_var”没有取值“val”?

【问题讨论】:

标签: class matlab properties


【解决方案1】:

Test 类已定义为value-class as opposed to a handle class。实际上,当您调用 a.change_var 时,a 会按值传递。要将更改存储到 some_var 属性,请执行以下操作:

>> a = 测试; >> a = a.change_var(2);

另一种方法是使 Test 成为句柄类,在这种情况下,您问题中的示例将按您的预期工作。为此,请通过将类定义的第一行更改为以下内容来继承 handle 类:

classdef 测试

【讨论】:

  • 宾果游戏!效果很好,非常感谢:) 我必须等待 4 分钟才能选择这个作为答案,但会这样做
  • 重要的是要提到,一旦类变成handle,分配给这个类的变量就会成为对内存中同一个对象的引用。更改其中一个变量中的属性将更改其他变量中的属性值,类似于 c# 中的对象引用。
【解决方案2】:

该方法提供了一种更改属性的方法,但您也应该返回对象。您需要将方法修改为:

function N = change_var( N, val )
     N.some_var=val;
end

请注意,该函数返回修改后的对象。接下来,您需要将 a 更新为:

a = a.change_var(2);

【讨论】:

  • 要明确一点:这里显示的示例是针对值对象类(即:不是句柄对象),它不会改变原始对象本身的属性。该函数在 N 参数中接收原始对象的 副本,修改该对象的 some_var 属性,并返回该对象的修改副本。
猜你喜欢
  • 1970-01-01
  • 2017-05-31
  • 1970-01-01
  • 1970-01-01
  • 2021-08-30
  • 2017-08-21
  • 2015-12-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多