MATLAB - получить объект, к которому принадлежит свойство? - PullRequest
0 голосов
/ 31 августа 2011

Предположим, у меня есть myClass < handle со свойством A. Если я создаю экземпляр myClass, скажем myObj, и передаю myObj.A функции, скажем function myFunc(val), можно ли в myFunc увидеть, что переданный ему val является свойством myObj

РЕДАКТИРОВАТЬ: Для контекста:

Я пишу API (в некотором смысле) для взаимодействия с оборудованием Arduino для моей исследовательской лаборатории. Общий класс называется Vehicle, со свойствами PinManager < handle, TelemCollector < handle и различными Device < handle s. У него также есть методы для таких вещей, как runMotor(), getAltitude() и т. Д. У меня есть метод TelemCollector.telemFetch(), который является обратным вызовом для события таймера; Я бы хотел, чтобы TelemCollector.telemFetch() имел доступ к Vehicle методам (а именно getAltitude()); наивно я бы просто сделал Vehicle свойством TelemCollector для доступа к этим методам. Я надеялся не делать этого.

EDIT2: пример фрагмента кода того, что я пытаюсь выполнить:

classdef Vehicle < handle
    properties
        PinManager
        TelemCollector
        Devices
    end
    methods
        function obj = Vehicle(PM, TC, D)
            obj.TC = TelemCollector();
            obj.PM = PinManager();
            obj.Devices = D();
        end 
        function val = getAltitude(obj)
            %# read altitude from a connected Device
        end
        function val = getSpeed(obj)
            %# read speed from connected Device
        end
    end
 end

 classdef TelemCollector < handle
     properties
         %# ...
     end
     methods
         function fetchTelem(obj)
             %# do getAltitude(), getSpeed(), etc, here.. but I want to access
             %# Vehicle.getAltitude() and Vehicle.getSpeed() somehow!
         end
     end
 end

Ответы [ 2 ]

5 голосов
/ 31 августа 2011

Насколько я знаю, нет.

Например, если myObj.A является двойным, myFunc будет просто передано значение, которое он содержит, и не будет никакой ссылки на объект. Если вы вызываете myFunc(somevariable), где somevariable действительно является именем переменной, а не выражением, то вызов inputname(1) внутри myFunc даст вам строку 'somevariable', но так как вы ссылаетесь на свойство класса, это слишком сложно для MATLAB и inputname(1) просто возвращает '' (протестировано с MATLAB R2011a).

Обновление : зачем вам это знать? Если ваши интерфейсы спроектированы правильно, вам, вероятно, не придется делать такие вещи. Или вы пытаетесь обойти чей-то баг / плохой дизайн? В зависимости от вашего приложения вы можете подумать о каком-то очень грязном хакере, включающем dbstack, пытаясь выяснить, какой m-файл вызвал вашу функцию, прочитать соответствующую строку кода из файла .m, проанализировать ее и затем получить доступ к объекту используя evalin('caller',...) ... но я сомневаюсь, что это хорошая идея; -).

Редактировать в ответ на предоставленный вами контекст:

Разве вы не можете просто переопределить свой обратный вызов Timer для передачи объекта "Автомобиль"? т.е.

set(yourtimer_handle,'TimerFcn',{@fetchTelem,vehicle_handle});

означает, что всякий раз, когда таймер обратного вызова вызывает функцию TelemCollector.fetchTelem (), он передает vehicle_handle в качестве третьего аргумента , как описано в документе . Это работает в сочетании с измененной функцией головы

function fetchTelem(obj, event, vehicle_handle)

где вы можете заменить event на ~ в более новых версиях MATLAB, если вам это не нужно.

Может ли это сработать?

2 голосов
/ 01 сентября 2011

fetchTelem не может вызывать методы объекта, на который он не ссылается.Таким образом, независимо от того, вам нужно предоставить свой объект TelemCollector с дескриптором Vehicle.

Лично я считаю, что связь между Vehicle и TelemCollector должна быть в противоположном направлении.Я бы предпочел что-то, похожее на:

V = Vehicle(PM, D);
TC = TelemCollector(V);

Хотя это действительно зависит от того, как вы собираетесь использовать классы.

Я согласен с @Jonas Heidelberg: если это так сложно, тогдавозможно, это неправильный интерфейс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...