在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
产生的任何影响在状态上。
答案 0 :(得分:2)
jshell drop jshell删除意味着将代码段的状态更改为DROPPED
并使它们处于非活动状态(因此它们不再处于活动状态,除非再次创建它们,否则您将无法使用它们)
删除代码段,使其变为非活动状态。提供导入,类,方法或变量的名称或ID。如果有多个摘要,请用空格分隔名称和ID。使用/ list命令查看代码段的ID。
由于未明确调用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)。