Дескриптор функции для метода в постоянном свойстве - PullRequest
0 голосов
/ 17 октября 2018

В R2018b у меня есть следующие настройки:

classdef SomeClass < handle    
    methods
        function SomeMethod(obj)
            disp in!
        end
    end    
end

classdef SomeOtherClass < handle

    properties (Constant)
        instance = SomeClass()
    end

    methods
        function Test(obj)
            hdl = @obj.instance.SomeMethod;
            hdl();            
        end
    end

end

Однако при запуске метода Test() выдается ошибка:

>> SomeOtherClass().Test() 
Undefined function or variable 'obj.instance.SomeMethod'.

Изменение метода Test() на:

function Test(obj)
    A   = obj.instance;
    hdl = @A.SomeMethod;
    hdl();
end

дает желаемый результат:

>> SomeOtherClass().Test
in!

Я озадачен ... зачем мне средний человек A?

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

После обнаружения @ gnovice:

>> obj = struct('instance', SomeClass());
>> hdl = @obj.instance.SomeMethod
hdl =
  function_handle with value:
    @obj.instance.SomeMethod

>> hdl(obj.instance)
Undefined function or variable 'obj.instance.SomeMethod'.

>> hdl()
Undefined function or variable 'obj.instance.SomeMethod'.

Но:

>> instance=SomeClass();
>> hdl = @instance.SomeMethod
hdl =
  function_handle with value:
    @(varargin)instance.SomeMethod(varargin{:})

>> hdl(instance)
Error using SomeClass/SomeMethod
Too many input arguments.

Error in @(varargin)instance.SomeMethod(varargin{:})

>> hdl()
in!

Обратите внимание, что дескриптор функции, созданный во втором случае, на самом деле является анонимной функцией, которая включает в себя объект,Это особый случай оператора @, а не обычное использование:

>> hdl=@SomeMethod
hdl =
  function_handle with value:
    @SomeMethod

>> hdl(instance)
in!

На самом деле этот случай создает анонимную функцию, которая встраивает объект, который вы намереваетесь вызвать этим методомна.Вы можете создать такую ​​функцию следующим образом:

>> hdl=@()obj.instance.SomeMethod()
hdl =
  function_handle with value:
    @()obj.instance.SomeMethod()

>> hdl()
in!
0 голосов
/ 18 октября 2018

У меня пока нет полного ответа, но вот еще немного пищи для размышления: вы можете воссоздать тот же результат, используя структуру вместо SomeOtherClass:

>> obj = struct('instance', SomeClass());
>> hdl = @obj.instance.SomeMethod;
>> hdl()
Undefined function or variable 'obj.instance.SomeMethod'.

Я склоняюсь к тому, что это ограничение того, как оператор обрабатывает функцию , в отличие от системы классов MATLAB.

...