How to avoid using eval in this case?
6 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
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 Kommentare
Walter Roberson
am 8 Dez. 2021
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
Akzeptierte Antwort
Matt J
am 8 Dez. 2021
Bearbeitet: Matt J
am 8 Dez. 2021
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 Kommentare
Weitere Antworten (0)
Siehe auch
Kategorien
Mehr zu Environment and Settings finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!