gpt4 book ai didi

model-view-controller - MATLAB 函数拒绝根据放置运行

转载 作者:太空宇宙 更新时间:2023-11-03 19:58:16 25 4
gpt4 key购买 nike

我在 MATLAB 中编写了一个非常简单的 GUI这将转换温度。它旨在作为一类学生的教程。然而奇怪的事情发生了。与任何 MVC 一样设计模式,有一个模型对象,一个 View 对象和一个 Controller 函数。为了设置 GUI 的输出字段(转换后的温度),您可以在 Controller 函数本身中运行此行:

set(views.outputTextField,'string',num2str(round(model.outTemp)));

其中 views.outputTextField 是一个 GUI 文本字段,用于显示转换后的温度,model.outTemp 是转换后的温度。非常简单。 views 对象引用了所有 GUI uicontrols,这会使用模型对象中新转换的温度更新字段。

但是,我宁愿在 View 对象中有 View 函数,所以我尝试创建这样一行:

views.updateOutputField = @()set(views.outputTextField,'string',...
num2str(round(model.outTemp)));

与之前相同的行,只是现在它是 View 对象中的匿名函数。这样我就可以简单地从 Controller 调用函数 views.updateOutputField(); 并将 View 逻辑置于 Controller 逻辑之外。但是这个方法行不通! (它get() 函数一起工作。)

相反,我必须执行以下操作:

views.updateOutputField = @updateOutputField

function updateOutputField()
set(views.outputTextField,'string',num2str(round(model.outTemp)));
end

通过(冗余地)分离函数而不是仅仅使用匿名函数,它又可以工作了。什么!?这对我来说毫无意义。 View 和模型对象是全局对象,匿名函数与 get() 一起使用。有人知道这里发生了什么吗?

最佳答案

这两种方法并不等同。匿名函数(又名 lambda)body 中的值正在被卡住,请参见下面的示例:

>> ii = 2;
>> val = @() ii+2;
>> val()
ans =
4
>> ii=5;
>> val()
ans =
4

您可以执行以下操作以使其工作:

views.updateOutputField = @(outTemp) ...

如果您想知道 MATLAB 如何捕获工作区上下文,请在匿名函数上使用函数 FUNCTIONS

您的示例有点复杂,因为您的viewmodel 存在于嵌套工作区中,但本质是相同的。

旁注:在 Matlab 类(class)中教授重要的设计模式 (MVC) 也值得称赞!

关于model-view-controller - MATLAB 函数拒绝根据放置运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1633813/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com