How to avoid using eval in this case?
조회 수: 4 (최근 30일)
이전 댓글 표시
Hi, I read in multiple threads that the usage of the function eval should be avoided as much as possible. But in the following case I couldn't find a neater way to do so. I have a uicontrol function, and I have several buttons that will set different variables in a similar way. The code is somewhat like below:
w = -1;
h = -1;
editW = uicontrol('Style','edit');
buttonW = uicontrol('Style','pushbutton');
editH = uicontrol('Style','edit');
buttonH = uicontrol('Style','pushbutton');
In total I have more than 5 pushbuttons, each set a specific variable to what is written in the associated edit field. One way to write the callback functions is:
buttonW.Callback = @setW;
buttonH.Callback = @setH;
function setW(hObject,eventData)
w = str2double(editW.String);
end
function setH(hObject,eventData)
h = str2double(editH.String);
end
In this way, I will have to write more than 5 callback functions, which they are simply doing very similar things, making the code look very redundant. So I was thinking using the eval function:
buttonW.Callback = {@setVariable,'w'};
buttonH.Callback = {@setVariable,'h'};
function setVariable(hObject,eventData,input)
% Grab the associated edit field
edit = eval(['edit',upper(input)]);
x = str2double(edit.String);
eval([input '= x']);
end
In this way, I only need to define the function once. Is there other way to somewhat achieve the same effect without using the eval function?
Thank you very much!
댓글 수: 2
Walter Roberson
2021년 12월 8일
function setW(hObject,eventData)
w = str2double(editW.String);
end
I am not clear as to what the purpose is of setting a local variable that is going to be immediately thrown away.
function SetVar(hObject, eventData)
value = str2double(hObject.String);
end
채택된 답변
Matt J
2021년 12월 8일
편집: Matt J
2021년 12월 8일
Store the numeric result to the UserData property of the button, instead of to individual variables.
edit(1) = uicontrol('Style','edit');
button(1) = uicontrol('Style','pushbutton');
edit(2)= uicontrol('Style','edit');
button(2) = uicontrol('Style','pushbutton');
input.edits=edit;
input.buttons=button;
[button.Callback]=deal({@setVariable,input})
function setVariable(hObject,eventData,input)
idx=arrayfun(@(a,b) isequal(a,b), hObject, input.buttons);
hObject.UserData = str2double(input.edits(idx).String);
end
댓글 수: 3
추가 답변 (0개)
참고 항목
카테고리
Help Center 및 File Exchange에서 Environment and Settings에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!