2014-12-28 3 views
2

У меня есть 2 var a и b.
Я хочу получить функцию для пользователя.заменить строку оператором и макросами в matlab

str='operator' 

это может быть либо '<', '==', '>', '||', '&&' и так далее.
Я использовал enum и switch - case.
Несмотря на то, что он работает, для многих функций это решение не является элегантным.

Есть ли способ оценить строку и использовать то, что внутри нее? что-то вроде макроса? пример: str='==' valuation(a str b) ==> выполняет a==b

Я искал информацию о макросах в MATLAB, и я не мог найти однозначный ответ. поэтому объяснение о том, что существует и как его использовать, может быть приятным (ссылки также хороши).

ответ

1

Я хотел бы использовать MAP:

operators={'+',@plus;'-',@minus;'==',@eq}; 
mapObj = containers.Map(operators(:,1),operators(:,2)); 

Этот список является неполным, если вы не знаете имя функции (plus) для оператора (+) типа в doc +

Чтобы использовать его , получить функцию ручки из карты:

f=mapObj('+') 

и оценить его:

f(a,b) 
+0

Спасибо! Я попробую. – ornit

+0

лучше, чем 'eval'. – Shai

0

Вы можете использовать eval:

a = 1; 
    b = 3; 
    st = '>'; %Take from user 
    stWithOp = ['a' st 'b' ]; 
    eval(stWithOp); 

Однако нужно учитывать, что получение строки от пользователя может позволить ему ввести вредоносный код. Например, пользователь может ввести:

%DO NOT TRY THIS AT HOME! 
st = '; rmdir(''C:\'') '; 
+0

Есть ли способ идентифицировать вредоносные входы? Думаю, в этом случае я могу проверить, что длина ввода не больше 1. но вообще? – ornit

+0

@ornit, не то, что я знаю. Ваш эвристический звук звучит хорошо. –

+0

'==' имеет длину два, поэтому вы должны разрешить хотя бы эту длину. В зависимости от того, где вы размещаете пробелы, '; f' будет вызывать' f' с параметром '' b'' или '+ 5', добавляет ведущую цифру в' b'. – Daniel

Смежные вопросы