7

似乎,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)]

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

4

1 回答 1

7

据此,关于JShell的一大警告是:它在自己的JVM 中运行。

create()的 javadoc说:

等效于 JShell.builder().build()。

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

构建一个 JShell 状态引擎。这是所有 JShell 功能的入口点。这将创建一个用于执行的远程进程。因此关闭返回的实例很重要。

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

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

于 2017-09-14T10:03:44.583 回答