【问题标题】:MATLAB: Function Handle of Nested FunctionMATLAB:嵌套函数的函数句柄
【发布时间】:2014-01-23 04:33:33
【问题描述】:

有没有办法为在函数句柄中包含父函数的嵌套函数创建函数句柄?

例如,假设我有:

function myP = myParent()

    myP.My_Method = myMethod;

    function myMethod()
        disp "hello world"
    end
end

在另一个文件中,我可以通过以下方式调用该方法:

myP = myParent();
myP.My_Method();

但是,如果我有另一个函数将函数句柄作为参数然后调用该函数,在这种情况下我如何将函数句柄传递给myMethod,因为这个新函数无法创建@987654326 @变量。

【问题讨论】:

  • 是的,这是可能的。这样做会创建一个closure。事实上,这是在引入classdef 样式对象之前实现OOP encapsulation 的一种方式

标签: matlab function-handle


【解决方案1】:

以下似乎有效:

function myP = myParent()

    myP.My_Method = @myMethod;

    function myMethod()
        s=dbstack;
        fprintf('Hello from %s!\n',s(1).name);
    end
end

运行如下:

>> myP = myParent()
myP = 
    My_Method: @myParent/myMethod
>> feval(myP.My_Method)
Hello from myParent/myMethod!
>> myP.My_Method()
Hello from myParent/myMethod!

也可以从另一个函数运行它:

% newfun.m
function newfun(hfun)
feval(hfun)

测试:

>> newfun(myP.My_Method)
Hello from myParent/myMethod!

根据您的操作,这应该足够了。请注意,您创建的每个句柄都是唯一的,因为 it contains information about externally scoped variables(在父级中提取的变量):

当您为嵌套函数创建函数句柄时,该句柄不仅存储函数的名称,还存储外部作用域变量的值。

【讨论】:

  • 对不起,我忘了把 @myMethod 放在我的原始代码中。我有这个。我真正想做的是能够为 My_Method 调用创建一个函数处理程序。有什么想法吗?
  • 您确实获得了一个函数句柄,但您必须首先通过myParent 获得,作为输出参数。输出变量myP不是myParent的实例,只是一个包含你需要的函数句柄的结构体。