如何以编程方式将变量添加到从中调用某些代码的 Shell?
How to programatically add variables to the Shell from which some code was invoked?
with jshell,有没有办法在解释器的范围内创建变量?我有类似的东西
Map<String,Object> vars = loadVarsFromSomething();
我希望能够做类似
的事情
for ( Map.Entry<String,Object> key : vars )
{
scope.put( key.getKey(), key.getValue() );
}
这可能吗?
注意这里我指的 "scope" 是 jshell 解释器正在使用的 Shell 对象的实际范围。我需要一个参考到从中调用代码的 shell,这样我就可以创建看起来好像是由 user/caller ..
分配的变量
要从输入文件加载变量,您可以使用 Jshell script 本身。
假设名为 some.jsh
的 Jshell 脚本需要提供两个变量,其中一个是字符串,另一个是原始整数。
// Random stuff initially
{
System.out.println("One Jshell Script");
}
// Variables to be supplied when jshell loads.
int x = 10;
String y = "Cool";
在执行上述脚本时使用:
jshell some.jsh
之后您可以使用它们的标识符访问这些变量,如下所示:-
毫无疑问,您可以使用更复杂的数据结构(在您的情况下Map<String,Object> vars
)以及在脚本中存储信息。
不,我认为不可能实现您的要求。我不确定你的用例到底是什么,但也许你可以使用以下代码片段来获取灵感:
jshell> /vars
| HashMap<String, Object> vars = {bar=2, foo=1}
jshell> try (PrintStream out = new PrintStream(new FileOutputStream("tmp.jsh"))) {
...> vars.forEach((k, v) -> out.printf("Object %s = vars.get(\"%s\")\n", k, k));
...> }
jshell> /open tmp.jsh
jshell> /vars
| HashMap<String, Object> vars = {bar=2, foo=1}
| Object bar = 2
| Object foo = 1
jshell>
with jshell,有没有办法在解释器的范围内创建变量?我有类似的东西
Map<String,Object> vars = loadVarsFromSomething();
我希望能够做类似
的事情for ( Map.Entry<String,Object> key : vars )
{
scope.put( key.getKey(), key.getValue() );
}
这可能吗?
注意这里我指的 "scope" 是 jshell 解释器正在使用的 Shell 对象的实际范围。我需要一个参考到从中调用代码的 shell,这样我就可以创建看起来好像是由 user/caller ..
分配的变量要从输入文件加载变量,您可以使用 Jshell script 本身。
假设名为 some.jsh
的 Jshell 脚本需要提供两个变量,其中一个是字符串,另一个是原始整数。
// Random stuff initially
{
System.out.println("One Jshell Script");
}
// Variables to be supplied when jshell loads.
int x = 10;
String y = "Cool";
在执行上述脚本时使用:
jshell some.jsh
之后您可以使用它们的标识符访问这些变量,如下所示:-
毫无疑问,您可以使用更复杂的数据结构(在您的情况下Map<String,Object> vars
)以及在脚本中存储信息。
不,我认为不可能实现您的要求。我不确定你的用例到底是什么,但也许你可以使用以下代码片段来获取灵感:
jshell> /vars
| HashMap<String, Object> vars = {bar=2, foo=1}
jshell> try (PrintStream out = new PrintStream(new FileOutputStream("tmp.jsh"))) {
...> vars.forEach((k, v) -> out.printf("Object %s = vars.get(\"%s\")\n", k, k));
...> }
jshell> /open tmp.jsh
jshell> /vars
| HashMap<String, Object> vars = {bar=2, foo=1}
| Object bar = 2
| Object foo = 1
jshell>