#javascript #dart
#javascript #dart
Вопрос:
Я хочу проанализировать входную математическую строку. Как мне это сделать в Dart (с помощью three.dart)?
Вот js (three.js ) версия:
zFunc = Parser.parse(zFuncText).toJSFunction( ['x','y'] );
meshFunction = function(x, y)
{
x = xRange * x xMin;
y = yRange * y yMin;
var z = zFunc(x,y); //= Math.cos(x) * Math.sqrt(y);
if ( isNaN(z) )
return new THREE.Vector3(0,0,0); // TODO: better fix
else
return new THREE.Vector3(x, y, z);
};
Ответ №1:
короче говоря: «не так просто, как в JS»
Объяснение :
если я хорошо понимаю ваши потребности, вы хотите иметь возможность анализировать строковое выражение, например :
String math_square_expr = "(x) => pow(x, 2)"
some_magic_func(math_squre_expr)(5) // return 25
но это возможно в javascript, потому что у вас есть некоторые функции, такие как ‘eval ()’ и другие, которые упрощают преобразование строки в код.
В Dart у вас нет такой функции. в этом случае ситуация больше похожа на Java.
У вас есть 2 варианта:
Создайте свой собственный математический анализатор -> это не круто, но если вам нужно совсем немного, это возможно
Используйте Js для выполнения задания -> другое решение — использовать Javascript для создания функции, но выполняемой с помощью dart. вот пример :
import 'dart:js';
void main() {
String function = "var f = function(x, y) { return x*x y; }";
JsObject functionJs = context.callMethod("eval", [function]);
print(functionJs);
print(context.callMethod("f", [5, 2]));
}
объяснение:
String function = "var f = function(x, y) { return x*x y; }";
Сначала я создаю переменную с именем function для имитации пользовательского ввода, ее нужно заменить вызовом или другой вещью, чтобы получить пользовательский ввод.
Важная вещь: я создаю функцию javascript, которую я сохраняю в переменной javascript. Это создаст глобальный символ javascript с именем f .
JsObject functionJs = context.callMethod("eval", [function]);
Здесь я вызываю функцию javascript «eval» для динамической оценки ранее созданной строки. после этой операции мой глобальный контекст JS будет содержать переменную с именем f, в которой хранится функция.
print(context.callMethod("f", [5, 2]));
Зная, что моя функция создана, и я могу получить к ней доступ, я вызываю хранилище функций в f с моими 2 параметрами (x = 5, y = 2) и отображаю результат.
Примечание: будьте осторожны с именем переменной JS, в которой вы будете хранить свою функцию. возьмите неиспользуемое имя.
Комментарии:
1. Первая строка — это просто пример входной строки. Вы можете заменить ее пользовательским вводом
2. Я объяснил свой код в ответе
(только что отредактированный)
3. Большое вам спасибо. Что делает double.parse() в Dart? Я нашел это в документах, и мне было интересно, было ли это чем-то похожим на ‘eval’.
4. Кроме того, как мне использовать / получить доступ к переменным ‘x’ и ‘y’ из функции?
5. double.parse() преобразует входную строку в double . Это функция, которая использует ‘x’ и ‘y’, чтобы изменить поведение, вам нужно изменить ядро функции (‘return x * x y’ — это просто пример). здесь x = 5 и y = 2, поэтому, если вы хотите изменить, просто измените параметр pass на ‘context.callMethod («f», [x, y])’ вызов