在 JShell 中访问 "parent scope"

Access to "parent scope" in JShell

看来,在另一个 JShell 中创建的 JShell 对象无法访问父对象的 JShell 范围。例如:

jshell> int x = 1;
x ==> 1

jshell> x
x ==> 1

jshell> jdk.jshell.JShell js = jdk.jshell.JShell.create();
js ==> jdk.jshell.JShell@1a052a00

jshell> js.eval("x");
 ==> [SnippetEvent(snippet=Snippet:ErroneousKey#1-x,previousStatus=NONEXISTENT,status=REJECTED,isSignatureChange=false,causeSnippetnull)]

jshell> js.eval("int x = 2;");
 ==> [SnippetEvent(snippet=Snippet:VariableKey(x)#2-int x = 2;,previousStatus=NONEXISTENT,status=VALID,isSignatureChange=true,causeSnippetnullvalue=2)]

jshell> js.eval("x");
 ==> [SnippetEvent(snippet=Snippet:ExpressionKey(x)#3-x,previousStatus=NONEXISTENT,status=VALID,isSignatureChange=true,causeSnippetnullvalue=2)]

是否有可能使父作用域对子作用域可见?

根据 ,关于 JShell 的一个重要警告是:它在其 自己的 JVM 中运行。

create() 的 javadoc 说:

Equivalent to JShell.builder().build().

当您查看 build() 的 javadoc 时,您会发现:

Build a JShell state engine. This is the entry-point to all JShell functionality. This creates a remote process for execution. It is thus important to close the returned instance.

换句话说:您很可能正在创建 另一个 JVM 实例,另一个 shell 运行该实例。所以至少现在:没有机会让 child jshell 知道它的 parent。

(如:我真心希望 Java 的这个 REPL 特性将允许在未来某个时候将 JShell 附加到已经 运行 的 JVM )