MATLAB - 获取属性所属的对象?
Posted
技术标签:
【中文标题】MATLAB - 获取属性所属的对象?【英文标题】:MATLAB - obtain the object a property belongs to? 【发布时间】:2011-08-31 17:53:50 【问题描述】:假设我有一个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:我正在尝试完成的示例代码 sn-p:
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
【问题讨论】:
我不太明白 - 首先你说 Vehicle 有一个 TelemCollector 类的属性,最后你说你正在考虑给 TelemCollector 一个 Vehicle 类型的属性?如果 telemFetch() 需要访问两个对象的内部,它需要是“外部”对象的方法,而不是内部对象才能使其工作。 ...也许您可以发布实际代码 sn-p 而不是文字描述;那会更容易理解... 将代码 sn-p 添加到 OP。我想让telemFetch()
访问Vehicle
方法;如果TelemCollector
的属性Vehicle
是TelemCollector
的属性,这是可行的。由于一切都是句柄,它们将引用正确的对象实例。当然,我真的不想那样做。
【参考方案1】:
据我所知,没有。
例如,如果myObj.A
是一个double,myFunc 将只传递它包含的值,并且不会引用该对象。如果你调用myFunc(somevariable)
,其中somevariable
实际上是一个变量的名称而不是一个表达式,那么在myFunc
内部调用inputname(1)
会给你字符串'somevariable',但是因为你指的是一个属性一个类,这对于 MATLAB 来说太复杂了,inputname(1)
只返回''
(用 MATLAB R2011a 测试)。
更新:你为什么需要知道这个?如果您的界面设计简洁,您可能不必做这种事情。或者您是否正在尝试解决其他人的错误/错误设计?根据您的应用程序,您可能会想到一些涉及dbstack
的非常肮脏的黑客攻击,试图找出哪个 m 文件调用了您的函数,从 .m 文件中读取适当的代码行,对其进行解析,然后访问该对象使用evalin('caller',...)
...但我怀疑这是个好主意;-)。
编辑以响应您提供的上下文:
你不能重新定义你的 Timer 回调来交出“Vehicle”对象吗?即
set(yourtimer_handle,'TimerFcn',@fetchTelem,vehicle_handle);
意味着每当回调计时器调用函数 TelemCollector.fetchTelem() 时,它会将 vehicle_handle 作为第三个参数as described in the docu 移交。这与更改的函数头一起使用
function fetchTelem(obj, event, vehicle_handle)
如果您不需要,可以在较新的 MATLAB 版本中将 event
替换为 ~
。
这行得通吗?
【讨论】:
您只需将 vehicle_handle 传递给 TelemCollector 构造函数,对吗?谢谢您的帮助。当我写信给 Nzbuu 时,我没有实现您的答案,而是稍微重写了界面。很高兴知道这是可行的(尽管不是最漂亮的事情)。伙计,我希望 MATLAB 有朋友课程.. 使用我的解决方案,TelemCollector 构造函数不需要拥有车辆句柄,只要您在可以访问车辆的地方设置回调即可。 回调 将把车辆交给它。但这是特定于您所说的 fetchTelem 由计时器调用的情况,因此,如果 Nzbuu 的解决方案不会给您带来其他问题,那肯定是更通用且同样干净的解决方案:-)。【参考方案2】:fetchTelem 不能调用它没有引用的对象的方法。因此,无论如何,您都需要为 TelemCollector 对象提供 Vehicle 句柄。
我个人认为 Vehicle 和 TelemCollector 之间的关联应该是相反的方向。我更喜欢看起来更像:
V = Vehicle(PM, D);
TC = TelemCollector(V);
虽然这实际上取决于您希望如何使用这些类。
我同意@Jonas Heidelberg 的观点:如果它这么难,那么它可能是错误的界面。
【讨论】:
这是我最终选择的路线;我给 Jonas Heidelberg 打了勾,因为它最好地回答了实际问题,但从设计的角度来看,你的方式更有意义。我同意,这是一个难题,它需要 (d) 重新考虑我如何将课程组合在一起。 +1 ...这是对原始问题背后的更通用的解决方案。以上是关于MATLAB - 获取属性所属的对象?的主要内容,如果未能解决你的问题,请参考以下文章