Есть ли способ удалить историю в JShell? - PullRequest
2 голосов
/ 06 мая 2019

В JShell, есть ли способ удалить оператор, который вы выполнили, как будто его никогда не было?

Например, предположим, что у нас есть следующий код.

 JShell shell = JShell.create();
 shell.eval("int x = 5;");
 shell.eval("x = 7;");

Есть ли что-то в JShell, которое возвращается на один шаг назад? То есть что-то вроде метода goBackOneStep(), где после его выполнения x возвращается к 5.

 shell.goBackOneStep();
 shell.eval("x") // x is evaluated to 5

Я заметил, что в JShell API есть метод под названием drop(Snippet), который, кажется, удаляет Snippet из истории, но он не устраняет никакого влияния, которое Snippet оказал на состояние ,

1 Ответ

2 голосов
/ 06 мая 2019

jshell drop jshell drop означает изменение состояния фрагментов на DROPPED и превращение их в неактивные (чтобы они перестали быть активными, и вы не сможете использовать их, пока не создадите их) еще раз)

Удаляет фрагмент, делая его неактивным. Укажите имя или идентификатор импорта, класса, метода или переменной. Для нескольких фрагментов разделите имена и идентификаторы пробелом. Используйте команду / list, чтобы увидеть идентификаторы фрагментов кода.

DROPPED

Фрагмент неактивен из-за явного вызова JShell.drop (Фрагмент).

В приведенном ниже коде у вас есть два snippets и с помощью drop вы сделали их неактивными

JShell shell = JShell.create();
          shell.eval("int x = 5;");
          shell.eval("x = 7;");

    shell.snippets().forEach(s1->shell.drop(s1));

    shell.snippets().forEach(s2->{
        System.out.println(shell.status(s2));   //DROPPED
    });

   shell.snippets().forEach(System.out::println);  //we print all active and inactive snippets

Таким же образом вы также можете видеть все активные и удаленные фрагменты в jshell консоли

/ list [option]

Отображение списка фрагментов и их идентификатора. Если опция не введена, отображаются все активные фрагменты, но не запускаются фрагменты запуска.

/ list -all

Отображает все фрагменты, включая фрагменты запуска и фрагменты, которые не были выполнены, были перезаписаны или удалены. Идентификаторы, начинающиеся с s, являются фрагментами запуска. Идентификаторы, начинающиеся с e, - это фрагменты, которые не были выполнены.

Есть ли в JShell что-то, что возвращается на один шаг?

В jshell каждый вход представляет собой ровно один фрагмент, поэтому откат фрагментов невозможен.

Входными данными должен быть ровно один полный фрагмент исходного кода, то есть одно выражение, оператор, объявление переменной, объявление метода, объявление класса или импорт. Чтобы разбить произвольный ввод на отдельные полные фрагменты, используйте SourceCodeAnalysis.analyzeCompletion (String).

...