Matlab:对句柄对象的引用

时间:2016-07-06 20:48:18

标签: matlab pointers reference pass-by-reference

我是否可以创建对句柄对象的引用,以便我可以在一个点上替换对象本身,并且引用将被更新?

示例:

classdef IShifter < handle
  methods (Abstract)
    x = Shift(this, x);
  end
end

classdef Shifter1 < IShifter
  methods
    function x = Shift(this, x)
      x = circshift(x, 1);
    end
  end
end

classdef Shifter2 < IShifter
  methods
    function x = Shift(this, x)
      x = [ 0 ; x ];
    end
  end
end



classdef Item
  properties (Access = 'private')
    shifter; % should be a pointer/reference to the object which is in the respective parent container object
  end

  methods
    function this = Item(shifter)
      this.shifter = shifter;
    end

    function x = test(this, x)
      x = this.shifter.Shift(x);
    end
  end
end

% note this is a value class, NOT a handle class!
classdef ItemContainer
  properties
     shifter;
     items;
  end

  methods
    function this = ItemContainer()
      this.shifter = Shifter1;
      this.items{1} = Item(this.shifter);
      this.items{2} = Item(this.shifter);
    end

    function Test(this)
      this.items{1}.Test( [ 1 2 3] )
      this.items{2}.Test( [ 1 2 3] )
    end
  end
end

然后,输出应为:

items = ItemContainer();
items.Test();
[ 3 1 2 ]
[ 3 1 2 ]
items.shifter = Shifter2;
items.Test();
[ 0 1 2 ]
[ 0 1 2 ]

但它是:

items = ItemContainer();
items.Test();
[ 3 1 2 ]
[ 3 1 2 ]
items.shifter = Shifter2;
items.Test();
[ 3 1 2 ]
[ 3 1 2 ]

因为将新的Shifter对象分配给父对象项不会更新容器中的引用。

我正在寻找像C这样的东西,其中所有“移位器”属性都是指针,我可以把我想要的任何Shifter对象放到这个“地址”中。

ItemContainer和Item不是句柄类。 我想避免使用事件来更新引用或实现set方法来更新引用

2 个答案:

答案 0 :(得分:0)

Matlab中的pass-by-reference概念到目前为止(并且大多数仅限于handle - 类)。它并没有像你想要的那样远。

如果您不想使用set方法,可以使用返回items

的get方法将{this.shifter,this.shifter}作为依赖属性

根据您的评论,items比单元格数组复杂一点。因此,您可能希望使用属性itemsStore(或itemsCache或您喜欢的任何名称来临时存储items)以及依赖属性{{1 }}。 items的get方法检查items是否为空;如果是,则重建项目数组并将其存储在itemsStore中,否则,它只返回itemsStore的内容。此外,您需要向itemStore添加一个清空shifter的set方法,以便需要重新创建itemsStore。请注意,MLint会向您发出警告,指出属性的set方法不应写入另一个属性。此警告旨在告诉您,当您保存对象然后再从磁盘加载它时,将执行所有设置的方法。根据执行顺序,设置写入其他属性的方法可能会产生意外结果。在您的情况下,它没有问题,因为清空items是您的代码旨在处理的东西。如果需要,可以右键单击MLint警告,禁用该行。

答案 1 :(得分:0)

不幸的是我不认为这在Matlab中是可行的。

但是,您可以使用set方法或subsasgnimport play.api.inject.Injector import javax.inject.Inject class SomeClassRequiringInjector @Inject() (injector: Injector) { ... } 定义时重新定义items{1}items{2}的内容。然后,您将能够获得您所要求的行为。

最佳,