Following calls to static methods with indexing wh

2019-03-26 01:33发布

问题:

I have a class file myClass.m in a package folder +myPack that's on the path. A simple example of the class file is:

classdef myClass
    properties
        prop
    end

    methods
        function obj = myClass(x)
            obj.prop = x;
        end
    end
end 

Now if I directly call the method and access the property using the full package name, i.e.:

x = myPack.myClass(2).prop;

returns x = 2 correctly. Now, if I try the same by importing this class (and not use the package name):

import myPack.myClass
y = myClass(2).prop

it gives me the following error:

Static method or constructor invocations cannot be indexed. Do not follow the call to the static method or constructor with any additional indexing or dot references.

Why does this work in the first case and not the second? As far as I understood, importing a class mainly allowed one to use the class name without the long package name (among other considerations). What is the difference in these two that causes this error and how can I work around it?

回答1:

Here is some more weird for you: the behavior is different if you are running in the command window, from a script, or from a function!

1) command prompt (1st: ok, 2nd: error)

This is what you've already shown

>> x = myPack.myClass(2).prop
x =
     2

>> import myPack.myClass; y = myClass(2).prop
Static method or constructor invocations cannot be indexed.
Do not follow the call to the static method or constructor with
any additional indexing or dot references. 

2) Script (1st: error, 2nd: error)

testMyClassScript.m

x = myPack.myClass(2).prop
import myPack.myClass; y = myClass(2).prop

and

>> testMyClassScript
Static method or constructor invocations cannot be indexed.
Do not follow the call to the static method or constructor with
any additional indexing or dot references.
Error in testMyClassScript (line 1)
x = myPack.myClass(2).prop 

(the second line would also throw the same error)

3) Function (1st: ok, 2nd: ok)

testMyClassFunction.m

function testMyClassFunction()
    x = myPack.myClass(2).prop
    import myPack.myClass; y = myClass(2).prop
end

and

>> testMyClassFunction
x =
     2
y =
     2

I would definitely call that a bug :) The expected behavior is to give an error in all cases.



标签: oop matlab