РЕДАКТИРОВАТЬ: После дополнительного рассмотрения и некоторого обсуждения в комментариях у меня есть сомнения, что дескрипторы функций могут передаваться через UDP. Поэтому я обновляю свой ответ, вместо этого предлагая использовать функцию FUNC2STR для преобразования дескриптора функции в строку для передачи, затем использую функцию STR2FUNC для преобразования ее обратно в снова обработать ручку после передачи ...
Чтобы обойти использование EVAL , вы можете использовать дескриптор функции вместо сохранения строки кода, которая будет выполняться в строке:
fcnToEvaluate = @do_something_or_other; %# Get a handle to the function
if execute_remotely
fcnString = func2str(fcnToEvaluate); %# Construct a function name string
%# from the function handle
send_via_udp(fcnString); %# Pass the function name string
else
fcnToEvaluate(); %# Evaluate the function
end
Вышеприведенное предполагает, что функция do_something_or_other
уже существует. Затем вы можете сделать что-то вроде следующего в удаленной системе:
fcnString = receive_via_udp(); %# Get the function name string
fcnToEvaluate = str2func(fcnString); %# Construct a function handle from
%# the function name string
fcnToEvaluate(); %# Evaluate the function
Пока код (т.е. m-файл) для функции do_something_or_other
существует как в локальной, так и в удаленной системах, я думаю, что это должно работать. Обратите внимание, что вы также можете использовать FEVAL для оценки строки имени функции, вместо того, чтобы сначала преобразовать ее в дескриптор функции.
Если вам нужно создать функцию на лету, вы можете инициализировать fcnToEvaluate
как анонимную функцию в своем коде:
fcnToEvaluate = @() disp('Hello World!'); %# Create an anonymous function
И код для отправки, получения и оценки должен быть таким же, как указано выше.
Если у вас также есть аргументы для передачи в вашу функцию, вы можете поместить дескриптор функции и ввести аргументы в массив ячеек . Например:
fcnToEvaluate = @(x,y) x+y; %# An anonymous function to add 2 values
inArg1 = 2; %# First input argument
inArg2 = 5; %# Second input argument
cellArray = {fcnToEvaluate inArg1 inArg2}; %# Create a cell array
if execute_remotely
cellArray{1} = func2str(cellArray{1}); %# Construct a function name string
%# from the function handle
send_via_udp(cellArray); %# Pass the cell array
else
cellArray{1}(cellArray{2:end}); %# Evaluate the function with the inputs
end
В этом случае код для send_via_udp
может разбить массив ячеек и отправить каждую ячейку отдельно. Полученная строка имени функции снова должна быть преобразована обратно в дескриптор функции, используя STR2FUNC .