访问JShell中的"父作用域"

And*_*niy 7 java java-9 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");
$4 ==> [SnippetEvent(snippet=Snippet:ErroneousKey#1-x,previousStatus=NONEXISTENT,status=REJECTED,isSignatureChange=false,causeSnippetnull)]

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

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

是否有可能使父范围对子视图可见?

Gho*_*ica 7

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

create()的javadoc 说:

相当于JShell.builder().build().

当你关注build()的javadoc时,你会发现:

构建一个JShell状态引擎.这是所有JShell功能的入口点.这将创建一个远程执行过程.因此,关闭返回的实例非常重要.

换句话说:最有可能的是,您正在创建另一个运行其他shell的JVM实例.所以至少现在:没有机会让一个孩子知道它的父母.

(如:我非常希望Java的这个REPL特性将来允许将JShell附加到已经运行的JVM)