在 JShell 中将变量转换为其原始形式
Convert variable to its original form in JShell
我正在玩 JShell 并尝试将变量转换为其原始形式。为此,我使用 /r
重置了 REPL 中的所有内容,然后我导入了 java.util.*
并创建了一个列表:
-> import java.util.*;
-> List<String> l = new ArrayList<>(Arrays.asList("a", "b"));
| Modified variable l of type List<String> with initial value [a, b]
现在我正在尝试将列表值转换为大写,所以我正在做:
-> l.replaceAll(String::toUpperCase)
-> l
| Variable l of type List<String> has value [A, B]
列出我使用 /list
(或 /l
)键入的已执行源显示:
-> /l
1 : List<String> l = new ArrayList<>(Arrays.asList("a", "b"));
2 : l.replaceAll(String::toUpperCase)
3 : l
现在,当我尝试将列表重置为阶段 1(在更改其值之前)时,我得到了 import
语句:
-> /1
import java.util.*;
有谁知道为什么会这样?我在没有 import
语句的情况下尝试了相同的方法,但我得到了相同的结果(我认为这是因为它被显式导入)。
我刚刚注意到如果我写 /l all
我会得到:
-> /l all
s1 : import java.util.*;
s2 : import java.io.*;
s3 : import java.math.*;
s4 : import java.net.*;
s5 : import java.util.concurrent.*;
s6 : import java.util.prefs.*;
s7 : import java.util.regex.*;
s8 : void printf(String format, Object... args) { System.out.printf(format, args); }
1 : String a = "a";
2 : a = "b"
我不知道为什么 /1
执行第一个 import
语句而不是第一个字符串赋值。同样很奇怪的是,即使 import java.util.*;
在那里,s5
也是 import java.util.concurrent.*;
(这显然是多余的)。
编辑
看起来问题已在 JDK 9 EA build 107 on 03-01-2016 (#4560) 中解决。
经过数小时的挖掘,我找到了解释。命令:
/list all
列出所有次执行,包括s在之前[=]悄悄自动执行的启动条目35=] REPL 开始:
s1 : import java.util.*;
s2 : import java.io.*;
s3 : import java.math.*;
s4 : import java.net.*;
s5 : import java.util.concurrent.*;
s6 : import java.util.prefs.*;
s7 : import java.util.regex.*;
s8 : void printf(String format, Object... args) { System.out.printf(format, args); }
1 : String a = "a";
2 : a = "b"
一种解决方案是使用 /setstart
命令并向其传递一个包含您指定的条目的文件。这样您将无法使用默认导入和方便的打印方法。
另一种解决方案是写 /9
(最后一个静默输入之后的状态)。
老实说,我对这两种解决方案都不满意,希望尽快有更好的解决方案。
我正在玩 JShell 并尝试将变量转换为其原始形式。为此,我使用 /r
重置了 REPL 中的所有内容,然后我导入了 java.util.*
并创建了一个列表:
-> import java.util.*;
-> List<String> l = new ArrayList<>(Arrays.asList("a", "b"));
| Modified variable l of type List<String> with initial value [a, b]
现在我正在尝试将列表值转换为大写,所以我正在做:
-> l.replaceAll(String::toUpperCase)
-> l
| Variable l of type List<String> has value [A, B]
列出我使用 /list
(或 /l
)键入的已执行源显示:
-> /l
1 : List<String> l = new ArrayList<>(Arrays.asList("a", "b"));
2 : l.replaceAll(String::toUpperCase)
3 : l
现在,当我尝试将列表重置为阶段 1(在更改其值之前)时,我得到了 import
语句:
-> /1
import java.util.*;
有谁知道为什么会这样?我在没有 import
语句的情况下尝试了相同的方法,但我得到了相同的结果(我认为这是因为它被显式导入)。
我刚刚注意到如果我写 /l all
我会得到:
-> /l all
s1 : import java.util.*;
s2 : import java.io.*;
s3 : import java.math.*;
s4 : import java.net.*;
s5 : import java.util.concurrent.*;
s6 : import java.util.prefs.*;
s7 : import java.util.regex.*;
s8 : void printf(String format, Object... args) { System.out.printf(format, args); }
1 : String a = "a";
2 : a = "b"
我不知道为什么 /1
执行第一个 import
语句而不是第一个字符串赋值。同样很奇怪的是,即使 import java.util.*;
在那里,s5
也是 import java.util.concurrent.*;
(这显然是多余的)。
编辑
看起来问题已在 JDK 9 EA build 107 on 03-01-2016 (#4560) 中解决。
经过数小时的挖掘,我找到了解释。命令:
/list all
列出所有次执行,包括s在之前[=]悄悄自动执行的启动条目35=] REPL 开始:
s1 : import java.util.*;
s2 : import java.io.*;
s3 : import java.math.*;
s4 : import java.net.*;
s5 : import java.util.concurrent.*;
s6 : import java.util.prefs.*;
s7 : import java.util.regex.*;
s8 : void printf(String format, Object... args) { System.out.printf(format, args); }
1 : String a = "a";
2 : a = "b"
一种解决方案是使用 /setstart
命令并向其传递一个包含您指定的条目的文件。这样您将无法使用默认导入和方便的打印方法。
另一种解决方案是写 /9
(最后一个静默输入之后的状态)。
老实说,我对这两种解决方案都不满意,希望尽快有更好的解决方案。