从java获取传递给jruby的变量

从java获取传递给jruby的变量,java,ruby,jruby,Java,Ruby,Jruby,这可能很简单,我会搜索这个,但没有运气 我有密码: import org.jruby.embed.ScriptingContainer; public class Test { public static void main(String[] args){ ScriptingContainer container = new ScriptingContainer(); int a = 1234; container.put("a", a);

这可能很简单,我会搜索这个,但没有运气

我有密码:

import org.jruby.embed.ScriptingContainer;
public class Test {
    public static void main(String[] args){
        ScriptingContainer container = new ScriptingContainer();
        int a = 1234;
        container.put("a", a);
        container.runScriptlet("a = a+10 ; puts a");
        System.out.println(a);

    }
}
您可以看到,
container.runScriptlet(“a=a+10;放置a”)is
1244
System.out.println(a)is
1234
现在我希望
a
变量在从jruby运行后必须更改,以便
System.out.println(a)应为
1244

如何做到这一点?

您的示例永远无法像编写的那样工作
int
是基本类型,将通过值传递,而不是通过引用传递。也就是说,值1234被传递给JRuby,而不是“a”。您可以在
container.put
中为变量指定不同的名称,这一点很容易看出

如果只想返回一个变量,可以:

如果您需要更多值,我建议创建一个简单的bean,您可以使用它以有组织的方式将值传递回:

public class Main {
    public static class Values {
        private String name;
        private Long age;

        public void setName(String n) {
            this.name = n;
        }

        public void setAge(Long a) {
            this.age = a;
        }

        public String toString() {
            return name + " is " + age + " years old!";
        }
    }

    public static void main(String[] args){
        ScriptingContainer container = new ScriptingContainer();
        Values vs = new Values();
        container.put("values", vs);
        container.runScriptlet("values.age = 20; values.name = 'Tanya'");
        System.out.println(vs);
    }
}
作为第三种解决方案,请遵循中的示例:


尝试传递一个对象,例如整数而不是整数。谢谢,我已经尝试过了,但没有成功:)Phooey。我为从Java应用程序调用Ruby脚本并获取信息而实现的代码在NDA下,因此我无法共享它,而且由于所有类加载器等原因,启动极其复杂。让Ruby脚本实现一个接口,然后使用org.jruby.javasupport.javaembeddeutils.rubyToJava获取Ruby类并将其转换为接口,这样您至少可以调用getter?
public class Main {
    public static class Values {
        private String name;
        private Long age;

        public void setName(String n) {
            this.name = n;
        }

        public void setAge(Long a) {
            this.age = a;
        }

        public String toString() {
            return name + " is " + age + " years old!";
        }
    }

    public static void main(String[] args){
        ScriptingContainer container = new ScriptingContainer();
        Values vs = new Values();
        container.put("values", vs);
        container.runScriptlet("values.age = 20; values.name = 'Tanya'");
        System.out.println(vs);
    }
}
ScriptingContainer container = new ScriptingContainer(LocalVariableBehavior.PERSISTENT);
container.runScriptlet("p=9.0");
container.runScriptlet("q = Math.sqrt p");
container.runScriptlet("puts \"square root of #{p} is #{q}\"");
System.out.println("Ruby used values: p = " + container.get("p") +
                   ", q = " + container.get("q"));