【问题标题】:Modify structure array from nested function with function handle使用函数句柄从嵌套函数修改结构数组
【发布时间】:2020-11-29 19:59:47
【问题描述】:

我正在尝试从嵌套函数中修改结构数组,其中嵌套函数通过函数句柄“返回”。据我所知,您不能从“外部”函数修改结构体数组,因为 MATLAB 通过值而不是引用传递参数。但是,您应该能够在嵌套函数中执行此操作,因为嵌套函数可以访问“父”范围。但是,当我使用函数句柄“寻址”该函数时,它不起作用。

代码如下:

function object = objectReader()
   object.counter = 0;
   object.getData = @GetData;

   function data = GetData(input)
      object.counter = object.counter+1;
      data = input*1.23456789;
   end

end

根据我的发现,可能是在制作函数句柄时,它还制作了“当前”范围的副本,因此该函数不再存在于“隔离环境”中。

所以问题是,如何在嵌套函数中修改结构数组,同时保持外部接口?通过外部界面,我的意思是你可以这样做:

object = objectReader();
data = object.getData(1);

每次调用 object.getData() 函数时,object.counter 都会递增。

【问题讨论】:

  • 这很奇怪而且很复杂。您正在尝试使用方法创建对象。为此使用classdef。闭包不是为此而设计的。

标签: matlab nested-function matlab-struct


【解决方案1】:

将计数器作为输出添加到您的示例中,您将看到增量:

function object = objectReader()
   object.counter = 0;
   object.getData = @GetData;

   function data = GetData(input)
      object.counter = object.counter+1;
      data = [input*10 ,object.counter];
   end
end

还有例子:

myobject = objectReader();
disp(myobject.getData(1)); % 10     1
disp(myobject.getData(1)); % 10     2

在此处阅读有关关闭的更多信息: https://research.wmz.ninja/articles/2017/05/closures-in-matlab.html

使用带有属性和方法的类更自然:https://uk.mathworks.com/help/matlab/matlab_oop/create-a-simple-class.html

【讨论】:

  • 这个解决方案不能作为例外工作,因为这个想法是增加myobject.counter。然而,更多地了解闭包,我能够改变逻辑,因此不再需要它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-05
  • 1970-01-01
  • 2018-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多