首页 > 解决方案 > Octave containers.map 在成员函数中不起作用

问题描述

我有以下测试代码,它只是创建一个空的哈希图(containers.map)并在之后填充它:

 hashtable = containers.Map('KeyType','char','ValueType','double');
 hashtable('test') = 1.0;

只要我在我的“主”文件中使用它,一切正常......但是如果我将这两行复制到自创类的成员函数中,就会出现错误:

错误:找不到类:MyClassName

错误:调用自

myMemberFunction 在第 15 行第 31 列

第 15 行是“hashtable('test') = 1.0;”所在的行 站立。如果我删除这一行,一切都会再次正常。我绝对不明白,为什么会出现错误,它找不到我的班级......我测试了我的班级,一切正常。

我通过以下方式设置课程:

1:创建了一个名为:“@MyClassName”的文件夹

2:创建了一个名为:“MyClassName”的构造函数文件

3:添加了一个构造函数,命名为:“function obj = MyClassName(obj)”

4:创建了一个名为:“myMemberFunction”的成员函数文件

5:在这个文件中创建了一个成员函数:“function obj = myMemberFunction(obj)

如果此代码(哈希图)位于我的构造函数中,则它可以正常工作。仅当它位于我的成员函数第 15 行“hashtable('test') = 1.0;”内时 犯了错误。

标签: containersoctave

解决方案


tl;博士 - 替换

hashtable('test') = 1.0;

subsasgn( hashtable, substruct( '()', {'test'} ), 1.0 );

不确定这是预期的行为,还是容器的副作用。 Map 是一个 classdef 定义的类,以及这是否是因为新旧样式类不能很好地相互配合。可能值得为此提交一个错误。但是,问题似乎是因为hashtable('test')在方法内部没有按预期进行解析 - 可能不是有效地将其视为“引用”操作,而是将其视为函数调用?

为了完整起见,这里有一个 MVCE:

% @MyClassName/MyClassName.m
function obj = MyClassName(obj)
    obj = struct('myfield', []);
    obj = class(obj, 'MyClassName');
end

% @MyClassName/display.m
function display( Obj );
    display( [inputname(1), '.myfield = '] );
    display( get( Obj, 'myfield' ) );
end

% @MyClassName/get.m
function Out = get( Obj, Field )
    Out = struct(Obj).(Field);
end

% @MyClassName/set.m
function Obj = set( Obj, Field, Val )
    Obj = struct(Obj);
    Obj.(Field) = Val;
    Obj = class( Obj, 'MyClassName' );
end

% @MyClassName/myMemberFunction.m
function obj = myMemberFunction(obj)
    hashtable = containers.Map('KeyType', 'char', 'ValueType', 'double');
    subsasgn( hashtable, substruct( '()', {'test'} ), 1.0 );
    obj = set( obj, 'myfield', hashtable );
end

在终端:

octave:1> a = MyClassName();
octave:2> a = myMemberFunction(a);
octave:3> a
  a.myfield = 
    containers.Map object with properties:
      Count     : 1
      KeyType   : char
      ValueType : double

推荐阅读