有什么办法可以删除JShell中的历史记录?

时间:2019-05-05 21:31:42

标签: java java-9 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产生的任何影响在状态上。

1 个答案:

答案 0 :(得分:2)

jshell drop jshell删除意味着将代码段的状态更改为DROPPED并使它们处于非活动状态(因此它们不再处于活动状态,除非再次创建它们,否则您将无法使用它们)

  

删除代码段,使其变为非活动状态。提供导入,类,方法或变量的名称或ID。如果有多个摘要,请用空格分隔名称和ID。使用/ list命令查看代码段的ID。

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控制台中查看所有活动和已删除的代码段

/列出[选项]

  

显示摘要及其ID的列表。如果未输入任何选项,则将显示所有活动的代码段,但不会显示启动代码段。

/列出-全部

  

显示所有片段,包括启动片段和失败,被覆盖或删除的片段。以s开头的ID是启动摘要。以e开头的ID是失败的代码段。

JShell中是否有东西可以退一步?

在jshell中,每个输入正好是一个代码段,因此无法回滚代码段。

  

输入应恰好是源代码的完整片段,即一个表达式,语句,变量声明,方法声明,类声明或导入。要将任意输入分成单独的完整摘录,请使用SourceCodeAnalysis.analyzeCompletion(String)。