Как я могу привести в порядок и уничтожить функцию в дартс? - PullRequest
0 голосов
/ 19 февраля 2020

По сути, мне нужно сохранить функцию и получить ту же функцию с помощью файла. jsonEncode / Decode не работает (потому что не происходит строковое преобразование), и я не могу найти другого способа сделать это. Класс Function не имеет метода получения параметров / тела, поэтому я даже не знаю, как реализовать свою собственную логику c.

functionEncode(Function x);
functionDecode(Function x); // How do I implement these?

Function x = (int x) {return x * 2;};

void main() {
   String encoded = functionEncode(x);
   Function decoded = functionDecode(x);
   assert(decoded == x); //passes
}

Кто-нибудь знает, как я мог бы преобразовать / уничтожить функцию? Это вообще возможно?

1 Ответ

2 голосов
/ 19 февраля 2020

То, что вы запрашиваете, - это, по сути, возможность запускать произвольный код (в форме строковых функций) во время выполнения. Это технически возможно сделать, но это окольным путем, и это продемонстрировано в статье на iiro.dev:

final code = 'void main() { print("Hello World"); }';
final uri = Uri.dataFromString(code, mimeType: 'application/dart');
await Isolate.spawnUri(uri, [], null);

(Полный текст статьи можно найти здесь .)

Однако есть несколько предостережений. Во-первых, он работает только тогда, когда ваша программа работает в режиме JIT, поэтому, если вы скомпилируете свою программу Dart в автономную программу, скомпилированную AOT, она просто не будет работать. (В Flutter это означает, что оно работает только тогда, когда приложение работает в режиме отладки, а не в режиме выпуска.)

Во-вторых, выполнение этого кода подпадает под тот же самый зонтик, что и использование eval в Javascript, в что он не только подвержен ошибкам, но и представляет собой огромный риск для безопасности. Если вы поместите этот код в приложение и опубликуете sh приложение, вы, по сути, устанавливаете бэкдор в телефонах людей, который позволяет кому-то запускать любой код, который он хочет. Нет никакого реального способа ограничить или изолировать эту функцию, так что это всегда будет проблемой безопасности до такой степени, что в вашем приложении всегда будет возможность стать вредоносным ПО для троянских коней.

Так что в основном ответ на ваш вопрос так же, как если бы кто-то спрашивал, как использовать eval. И ответ всегда один и тот же: ВЫ НЕ .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...