Есть ли способ удалить историю в JShell?

Есть ли в 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 оказал на состояние.


person Lindstorm    schedule 05.05.2019    source источник


Ответы (1)


jshell drop jshell drop означает изменение статуса сниппетов на DROPPED и их неактивность (чтобы они больше не были активными и вы не могли их использовать, пока не создадите их снова)

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

DROPPED

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

В приведенном ниже коде у вас есть два 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 [параметр]

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

/список -все

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

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

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

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

person Deadpool    schedule 05.05.2019
comment
Спасибо. Знаете ли вы что-нибудь похожее на JShell, которое могло бы хранить историю текущего состояния программы (строка за строкой), но также могло бы вернуться назад? - person Lindstorm; 06.05.2019
comment
Кроме того, первоначальное отрицательное голосование было связано с тем, что сначала я не увидел, где вы ответили на мой вопрос. Похоже, вы говорили только о drop(Snippet), что немного не соответствовало тому, что я искал. Я перевернул это, когда я прочитал все это. Я бы, возможно, поместил эту часть в начало для будущих ответов - person Lindstorm; 06.05.2019
comment
я не думаю, что вы можете найти что-то подобное Do you know of anything similar to JShell that could keep a history of the current state of a program (line by line) @Lindstorm - person Deadpool; 06.05.2019