Can properties of an object handle returned from a

2019-06-28 00:55发布

问题:

I have a function that returns a handle to an instantiated object. Something like:

function handle = GetHandle()
    handle = SomeHandleClass();
end

I would like to be able to use the return value like I would if I was writing a program in C:

foo = GetHandle().property;

However, I get an error from MATLAB when it tries to parse that:

??? Undefined variable "GetHandle" or class "GetHandle".

The only way I can get this to work without an error is to use a temporary variable as an intermediate step:

handle = GetHandle();
foo = handle.property;

Is there a simple and elegant solution to this, or is this simply impossible with MATLAB's syntax?

回答1:

To define static properties, you can use the CONSTANT keyword (thanks, @Nzbuu)

Here's one example from MathWorks (with some errors fixed):

classdef NamedConst
   properties (Constant)
      R = pi/180;
      D = 1/NamedConst.R;
      AccCode = '0145968740001110202NPQ';
      RN = rand(5);
   end
end

Constant properties are accessed as className.propertyName, e.g. NamedConst.R. The values of the properties are set whenever the class is loaded for the first time (after the start of Matlab, or after clear classes). Thus, NamedConst.RN will remain constant throughout a session as long as you don't call clear classes.



回答2:

Hmm, I don't like to disagree with Jonas and his 21.7k points, but I think you can do this using the hgsetget handle class instead of the normal handle class, and then using the get function.

function handle = GetHandle()
    handle = employee();
end


classdef employee < hgsetget
    properties
        Name = ''
    end
    methods
        function e = employee()
            e.Name = 'Ghaul';
        end
    end
end

Then you can use the get function to get the property:

foo = get(GetHandle,'Name')

foo =

Ghaul

EDIT: It is not excactly like C, but pretty close.



回答3:

The only way to have a static property in MATLAB is as a constant:

classdef someHandleClass < handle
    properties (Constant)
        myProperty = 3
    end
end

then someHandleClass.myProperty will return 3.