Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop MATLAB是否支持;“可赎回”;(即类似函数的)类?_Oop_Matlab_Functional Programming_Operator Overloading - Fatal编程技术网

Oop MATLAB是否支持;“可赎回”;(即类似函数的)类?

Oop MATLAB是否支持;“可赎回”;(即类似函数的)类?,oop,matlab,functional-programming,operator-overloading,Oop,Matlab,Functional Programming,Operator Overloading,是否可以定义一个MATLAB类,以便像调用任何其他函数一样调用该类中的对象 我想问的是,人们是否可以在MATLAB中编写类似以下Python类的等价物: # define the class FxnClass class FxnClass(object): def __init__(self, template): self.template = template def __call__(self, x, y, z): print self.t

是否可以定义一个MATLAB类,以便像调用任何其他函数一样调用该类中的对象

我想问的是,人们是否可以在MATLAB中编写类似以下Python类的等价物:

# define the class FxnClass
class FxnClass(object):
    def __init__(self, template):
        self.template = template

    def __call__(self, x, y, z):
        print self.template % locals()

# create an instance of FxnClass
f = FxnClass('x is %(x)r; y is %(y)r; z is %(z)r')

# call the instance of FxnClass
f(3, 'two', False)

...
[OUTPUT]
x is 3; y is 'two'; z is False

谢谢

我不知道MATLAB是否直接支持你想要的,但是MATLAB确实支持一流的函数;因此,闭包可以提供一个可用的替代品,例如:

function f = count_call(msg)
    calls = 0;

    function current_count()
        disp(strcat(msg, num2str(calls)));
        calls = calls + 1;
    end

    f = @current_count;
end
在这种情况下,
当前\u计数
关闭
调用
(和
消息
)。这样,您可以表示依赖于某些内部状态的函数。您可以这样使用它:

g = count_call('number of calls: ') % returns a new function ("__init__")
g()                                 % "__call__"

我很想知道,如果不在Matlab中简单地创建java方法,这是否可行。我知道你可以做到以下几点

classdef ExampleObject
    properties
        test;
    end
    methods
        function exampleObject = ExampleObject(inputTest)
            exampleObject.test=inputTest;
        end
        function f(exampleObject,funcInput)
            disp(funcInput+exampleObject.test);
        end
    end
end

>> e=ExampleObject(5);
>> f(e,10)
    15

但据我所知,如果您试图覆盖调用函数,您将与Matlab的括号下标reference
subsref
发生冲突。你可以找到一个说明如何覆盖它的引用,你也许可以让它做你想做的事情……但是这样做似乎不是一个好的形式。不确定Matlab如何处理对对象(相对于函数)的调用,而不使其与此混淆。

如果您的意思是希望一个类包含一个像普通函数一样使用的方法(例如,在m文件中定义),那么是的,Matlab确实支持

静态方法独立于该类的任何实例运行,事实上,您甚至不需要实例化一个类来使用其静态方法

但是,Matlab不支持,因此您必须先实例化这样一个类,然后在使用函数之前设置它的字段(因为您要问这个问题,函数可能会使用这些字段)


考虑到静态成员的限制,您最好使用闭包,因为。

一种方法是重写类的函数:

classdef FxnClass < handle
    properties
        template
    end
    methods
        function obj = FxnClass(t)
            obj.template = t;
        end

        function out = feval(obj, varargin)
            out = sprintf(obj.template, varargin{:});
        end
    end
end
现在,如果您想提供额外的功能,您可以按照建议为您的类创建函数。将以下内容添加到上一个类定义中:

classdef FxnClass < handle
    ...

    methods
        function out = subsref(obj, S)
            switch S(1).type
                case '.'
                    % call builtin subsref, so we dont break the dot notation
                    out = builtin('subsref', obj, S);
                case '()'
                    out = feval(obj, S.subs{:});
                case '{}'
                    error('Not a supported subscripted reference');
            end
        end
    end
end
就个人而言,我并不特别喜欢重写
subsref
subsasgn
函数。它们用于太多的案例,有时很难让它们写出。例如,以下所有操作最终将使用不同的输入调用
subsref
方法:

f(..)
f.template
f.template(..)
f(..).template
f(..).template(..)
还有一种情况是
end
关键字可能出现在索引中,因此在某些情况下,您可能还必须覆盖它。更不用说对象也可以连接到数组中,这使得事情更加复杂:

>> ff = [f,f];
>> ff(1)        % not what you expect!

也就是说,我认为在这种情况下,使用嵌套函数和闭包的建议更为优雅:

function f = FxnClass(t)
    f = @call;
    function out = call(varargin)
        out = sprintf(t, varargin{:});
    end
end
如前所述:

>> f = FxnClass('x = %f, y = %s, z = %d');
>> f(3, 'two', false)

不,kjo想把一个对象当作一个函数来处理。@Frank,我真的不明白这一点。为了什么?这样他就可以控制类的方法了?这可以通过将值传递给构造函数来完成,构造函数设置字段,然后像往常一样调用函数。这样他就可以给构造函数调用一个新的?这可以通过创建一个调用构造函数的匿名函数来实现。没有争论这个问题,只是好奇。据我所知,kjo本质上是想实现某种形式的部分应用程序。是的,从技术上讲,如果你有对象的话,你不需要闭包(反之亦然)。@Frank那么,制作一个函数,它接受一个参数,使用该参数转换另一个函数,然后返回一个被转换函数的句柄,怎么样?也就是说,
make_power=@(base)(@(x)power(base,x))
(取自)嗯,这是一个闭包;事实上,它在功能上等同于我提出的解决方案。这可能要求太多了,但是假设您的调用有两个参数“x”,“y”,那么当您尝试在“f”(“?@Derek”)中时,是否可以让MATLAB预测签名?我不确定我是否理解您的问题..预测签名是什么意思?
function f = FxnClass(t)
    f = @call;
    function out = call(varargin)
        out = sprintf(t, varargin{:});
    end
end
>> f = FxnClass('x = %f, y = %s, z = %d');
>> f(3, 'two', false)