我有一组代码,根据程序的启动方式,将在本地执行或发送到远程机器执行。我认为这种方法可行的理想方式如下:
line_of_code = 'do_something_or_other();';
if execute_remotely
send_via_udp(line_of_code);
else
eval(line_of_code);
end
问题是,我知道eval()
函数效率低得离谱。另一方面,如果我在line_of_code
块的每个部分写出if
,则会打开错误的大门。除了简单地使用eval()
吗?
答案 0 :(得分:3)
编辑:在评论中进行了更多的考虑和讨论之后,我怀疑函数句柄是否可以通过UDP传输。我正在更新我的答案,而是建议使用函数FUNC2STR将函数句柄转换为字符串进行传输,然后使用函数STR2FUNC将函数句柄再次转换回函数句柄。传输...
要使用EVAL,您可以使用function handle而不是存储要在字符串中执行的代码行:
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
只要本地和远程系统上存在函数do_something_or_other
的代码(即m文件),我认为这应该有效。请注意,您还可以使用FEVAL来评估函数名称字符串,而不是首先将其转换为函数句柄。
如果您需要动态创建功能,可以在代码中将fcnToEvaluate
初始化为anonymous function:
fcnToEvaluate = @() disp('Hello World!'); %# Create an anonymous function
发送,接收和评估此代码的代码应与上述相同。
如果您也有传递给函数的参数,则可以将函数句柄和输入参数放入cell array。例如:
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转换回函数句柄。