cd()后删除类的matlab meta.class句柄

pzfprimi  于 2023-01-13  发布在  Matlab
关注(0)|答案(1)|浏览(203)

"我的问题"
如果我有一个叫做SomeClass的本地类,运行下面的脚本m:
某个类m

classdef SomeClass
end

手写体. m

t = ?SomeClass;
t
cd('SomeDir');
t
cd('..');
t

然后Matlab(R2018b)将输出以下内容:

t = 

  class with properties:

                     Name: 'SomeClass'
              Description: ''
      DetailedDescription: ''
                   Hidden: 0
                   Sealed: 0
                 Abstract: 0
              Enumeration: 0
          ConstructOnLoad: 0
         HandleCompatible: 0
          InferiorClasses: {0×1 cell}
        ContainingPackage: [0×0 meta.package]
     RestrictsSubclassing: 0
             PropertyList: [0×1 meta.property]
               MethodList: [2×1 meta.method]
                EventList: [0×1 meta.event]
    EnumerationMemberList: [0×1 meta.EnumeratedValue]
           SuperclassList: [0×1 meta.class]

t = 

  handle to deleted class

t = 

  handle to deleted class

所以在cd命令之后,变量t现在指向:

handle to deleted class

所以我的问题是:
1.为什么会发生这种情况?
1.我能做些什么来解决/规避它?

    • 奖金信息**

在我编写的实际软件中(50K行怪物),上述问题几乎发生在所有包含meta. class的变量中。是的,我说几乎:)这是stranges部分,所以有时候它发生在一些类上,而不是其他类上?所以在我遇到这个问题的特定情况下,我有两个类在子包中,类似于:

package.subpackage.ExampleReport
package.subpackage.FlowchartReport

这两个类几乎相同,并且是同一个基类的子类。?package. subpackage. ExampleReports的所有变量即使在cd命令之后仍然存在。但是指向?package.subpackage.FlowchartReports的变量不存在。遗憾的是,我无法在一个简单的示例中重现这一点。

    • 为什么我不能跳过cd()命令**

我使用system()命令运行一个windows命令行程序。在这个特定的例子中,我位于正确的路径上对于调用正常工作是很重要的。

whlutmcx

whlutmcx1#

我遇到了一个类似的问题,发现了这个问题(我自己的)。由于它没有任何答案,我将分享我是如何解决这个问题的。
我创建了一个类(MetaContainer)来存储元类的名称,如果元类被删除,MetaContainer将使用meta.class.fromName()重新创建它

classdef MetaContainer < handle
    % MetaContainer is created to retain the value of a Matlab metaclass
    % even if Matlab deletes it at some point.
    
    properties
        Meta
        Name
    end
    
    methods
        function self = MetaContainer(meta)
            % Constructor
            %
            % Parameters
            % ----------
            % meta : metaclass
            %     The metaclass that is to be protected from deletion

            assert(isa(meta, 'meta.class'), 'Invalid metaclass for MetaContainer');
            self.Meta = meta;
            self.Name = meta.Name;
        end
        
        function result = Get(self)
            % Returns
            % -------
            % metaclass
            %     The contained metaclass, if Matlab has deleted it then it
            %     is restored.

            if ~isvalid(self.Meta)
                self.Meta = meta.class.fromName(self.Name);
            end

            result = self.Meta;
        end
    end 
end

相关问题