是否可以在一行中从函数中获取类值并对其进行修改?

时间:2014-06-27 10:03:17

标签: matlab static return-value pass-by-value

如果我有课

classdef foo
    properties
        a = 0;
    end

    methods
        function obj foo(obj)
            obj.a = 5;
        end
    end
end

一个功能

function result = GetFoo()
    result = foo();
end

在命令解释器:

>> x = GetFoo()

x =

  foo

  Properties:
                       a: 5

  Methods

>> x.a = 10

x =

  foo

  Properties:
                       a: 10

  Methods

这会产生一个foo的实例和值' a'可以分配。但是,一步完成同样的事情:

>> GetFoo().a = 10

GetFoo =

  a: [1x1 struct]

这会创建一个名为GetFoo的新结构,该结构会覆盖该类并为其提供一个名为' a'的成员。而不是代码得到GetFoo()(类实例)的结果和设置其属性' a' = 10,它改为。我可以看到,它很可能是动态创建弱类型结构的能力,并且代码必须向后兼容它似乎与MATLAB没有指针概念的事实相关,所以每个输入/输出参数是一个深层副本,即使它可以工作,上面的内容也是设置GetFoo()用于获取其返回对象的值的副本的值,然后将其丢弃。

尽管如此,目标实际上是能够完成我需要的所有工作而无需创建并要求清除临时变量。意图是代码可维护性和化妆风格一样多。

2 个答案:

答案 0 :(得分:0)

你在问题​​中混合了很多不同的问题/抱怨,但我怀疑你正在寻找的是handle课程。从handle继承你的类(即写classdef foo < handle,你的类将具有基本的传递引用行为。你是对的,MATLAB不使用指针,但使用句柄类它确实有参考资料。

另外,在MATLAB中不可能索引到函数的输出(即写GetFoo.aGetFoo().a - 你需要一个临时变量,无论它是否返回价值或处理类。

请注意,在上面的示例中,GetFoo().a = 10的结果不是foo的实例,其属性a等于10 - 它是一个带有字段{{的结构1}}等于10.输入a,你会看到它是一个结构,而不是一个foo。

答案 1 :(得分:0)

这真的很难看,但只是为了提高在一条线上做的手套。 : - )

首先,我将修改该类,以便您看到构造函数被调用:

classdef foo
properties
        a = 0;
end;

methods
        function obj = foo()
                obj.a = 5;
                display('foo!');
        end;
end;
end

单行,在命令窗口中运行:

>> subsasgn(GetFoo(), struct('type', '.', 'subs', 'a'), 10);
foo!