Matlab 是否可以在一行中从函数中获取类值并对其进行修改?
如果我有课Matlab 是否可以在一行中从函数中获取类值并对其进行修改?,matlab,static,return-value,pass-by-value,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
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()值的副本用于获取其返回对象的源代码,然后将其丢弃
尽管如此,目标确实是能够完成我需要的所有工作,而无需创建和清除临时变量。其目的是代码的可维护性和外观风格。您的问题中混合了许多不同的问题/抱怨,但我怀疑您想要的是一个
句柄
类。从handle
(即writeclassdef foo
)继承您的类,您的类将具有基本上通过引用传递的行为。您是对的,MATLAB不使用指针,但对于handle类,它确实具有引用
另外,在MATLAB中不可能索引到函数的输出(即写入GetFoo.a
或GetFoo().a
)-无论它是否返回值或句柄类,都需要一个临时变量
请注意,在上面的示例中,
GetFoo().a=10
的结果不是属性a
等于10的foo
的实例-它是一个字段a
等于10的结构。Typeclass(GetFoo)
,您将看到它是一个结构,而不是一个foo。这真的很难看,但只是在一行中举起了做这件事的手套。:-)
首先,我将稍微修改该类,以便您可以看到构造函数被调用:
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!
一些注释:1)有一些看起来像指针的东西:handle
类,即继承handle
抽象类的类。它们被创建一次并作为引用传递,直到没有其他东西引用它们(然后它们被销毁)。但是,这对您提到的行为没有帮助。2) 保持全局工作区整洁的最佳方法是尽可能多地使用函数。他们的本地工作区会自动清理。3)我认为一行就可以做你想做的事情,但比两步做要难看得多。我会试着把这个令人讨厌的问题作为一个答案,但请不要投反对票。:-)